问题
I have designed a listview by inflating each row using inflater and I have changed color of convertView's elements on their click events. But after scrolling the list the elements loss these changes. How can I "preserve" their state and represent them?
And there is one more query in my mind, when clicking the submit button, how can I calculate the total number of "listitems" which had not been clicked?
before scroll http://69.imagebam.com/download/l4tJZG08i5tM_7SV3K_fHQ/18631/186307764/snap1.png after scroll http://17.imagebam.com/download/CC3cRv0ITi42Fo8WWUs86g/18631/186307781/snap4.png
Here is my code:
package scf.login;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.graphics.Color;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.BaseAdapter;
import android.widget.Button;
import android.widget.ListView;
import android.widget.TextView;
import android.widget.Toast;
public class firstsubActivity extends Activity
{
//variable declaration
ListView lvSubCat;
Intent action;
Button btnBack,btnSubmit,btnNext;
Boolean submission=false;
Integer unchecked=0;
String[] subStatus = {"","Ok","","","","Ok","","","Alert","","","","Checked","","","Ok","","","Alert",""};
// defining on click listener
android.view.View.OnClickListener lstnr = new android.view.View.OnClickListener()
{
@Override
public void onClick(View v)
{
switch (v.getId()) {
case R.id.btnBack:
Toast.makeText(getApplicationContext(), "Back button clicked", Toast.LENGTH_SHORT).show();
break;
case R.id.btnSubmit:
if(!submission)
{
checkcompletion();
if(unchecked>0)
{
Toast.makeText(firstsubActivity.this, "Complete the precheking of "+unchecked+" intervention(s) highlighted by Gray colour", Toast.LENGTH_LONG).show();
}
else
{
Toast.makeText(firstsubActivity.this,"Successfully submitted !!",Toast.LENGTH_SHORT).show();
submission=true;
}
}
else
{
updatecofirmation();
}
break;
case R.id.btnNext:
if(submission)
{
nextconfirmation();
}
else
{
Toast.makeText(firstsubActivity.this,"Submit the answers",Toast.LENGTH_SHORT).show();
}
break;
}
}
private void nextconfirmation()
{
AlertDialog.Builder builder = new AlertDialog.Builder(firstsubActivity.this);
builder.setCancelable(false);
builder.setTitle("Confirmation message");
builder.setMessage("Do you want to leave this page ?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Intent action = new Intent(firstsubActivity.this,cat_subcatActivity.class);
startActivity(action);
}
});
builder.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(firstsubActivity.this, "No clicked", Toast.LENGTH_SHORT).show();
}
});
builder.create().show();
}
private void updatecofirmation()
{
AlertDialog.Builder builder2 = new AlertDialog.Builder(firstsubActivity.this);
builder2.setCancelable(false);
builder2.setTitle("Confirmation message");
builder2.setMessage("Do you want to update answers ?");
builder2.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
submission=false;
btnSubmit.performClick();
}
});
builder2.setNegativeButton("No", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// TODO Auto-generated method stub
Toast.makeText(firstsubActivity.this, "No clicked", Toast.LENGTH_SHORT).show();
}
});
builder2.create().show();
}
private void checkcompletion()
{
unchecked=subStatus.length;
try
{
for(Integer j=0;j<subStatus.length;j++)
{
// CONFUSED
}
}
catch (Exception e) {
e.printStackTrace();
}
finally
{
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.firstsub);
//Binding
lvSubCat = (ListView)findViewById(R.id.lvSubCat);
btnBack = (Button)findViewById(R.id.btnBack);
btnSubmit=(Button)findViewById(R.id.btnSubmit);
btnNext = (Button)findViewById(R.id.btnNext);
//setting listeners
btnBack.setOnClickListener(lstnr);
btnSubmit.setOnClickListener(lstnr);
btnNext.setOnClickListener(lstnr);
//data of subcategories and their status from database
String[] subCat = {"zero","first","second","third","forth","fifth","sixth","seventh","eighth","ninth","tenth","eleventh","twelfth","thirteenth","forteenth","fifteenth","sixteenth","seventeenth","eighteenth","ninteenth"};
String[] subStatus = {"","Ok","","","","Ok","","","Alert","","","","Checked","","","Ok","","","Alert",""};
/*
for(Integer i=0;i<subStatus.length;i++)
{
set the status of each subcategory
}
*/
//setting adapter and binding adapter to the views
MySimpleAdapter adapter1 = new MySimpleAdapter(this,subCat);
lvSubCat.setAdapter(adapter1);
}
//defining customised MySimpleAdapter class inside firstsubActivity class
public class MySimpleAdapter extends BaseAdapter
{
private final Activity context;
private final String[] subCat;
public MySimpleAdapter(Activity context, String[] subCat)
{
super();
this.context = context;
this.subCat = subCat;
}
/*
protected class viewHolder
{
TextView tvOk;
Button btnChecked,btnAlert;
}
*/
@Override
public int getCount() {
// TODO Auto-generated method stub
return subCat.length;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
// final viewHolder holder = new viewHolder();
//inflating
LayoutInflater inflater = context.getLayoutInflater();
convertView = inflater.inflate(R.layout.lstinfl,null);
//binding
final TextView tvOk=(TextView)convertView.findViewById(R.id.tvOk);
final Button btnChecked=(Button)convertView.findViewById(R.id.btnChecked);
final Button btnAlert=(Button)convertView.findViewById(R.id.btnAlert);
//inserting subcategories
tvOk.setText(subCat[position]);
//representing subcategories according to their status
try
{
for(Integer k=0;k<subStatus.length;k++)
{
// CONFUSED
}
}
catch (Exception e) {
// TODO: handle exception
}
finally
{
}
//listeners to change the Color and Status
tvOk.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
tvOk.setClickable(false);
btnChecked.setClickable(true);
btnAlert.setClickable(true);
tvOk.setBackgroundColor(Color.GREEN);
btnChecked.setBackgroundColor(Color.WHITE);
btnAlert.setBackgroundColor(Color.WHITE);
subStatus[position]="Ok";
}
});
btnChecked.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tvOk.setClickable(true);
btnChecked.setClickable(false);
btnAlert.setClickable(true);
tvOk.setBackgroundColor(Color.BLACK);
btnChecked.setBackgroundColor(Color.YELLOW);
btnAlert.setBackgroundColor(Color.WHITE);
subStatus[position]="Checked";
// action = new Intent(getApplicationContext(), subdescActivity.class);
// startActivity(action);
}
});
btnAlert.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
tvOk.setClickable(true);
btnChecked.setClickable(true);
btnAlert.setClickable(false);
tvOk.setBackgroundColor(Color.BLACK);
btnChecked.setBackgroundColor(Color.WHITE);
btnAlert.setBackgroundColor(Color.RED);
subStatus[position]="Alert";
// action = new Intent(getApplicationContext(), subdescActivity.class);
// startActivity(action);
}
});
return convertView;
}
}
}
回答1:
Well, you're saving both states (text and status) in arrays, so at least that part is good. Now you need to check the states[]
in your getView() to set the correct look and feel of your buttons according to it, something like:
if (subStatus[position].equals("Ok")) {
tvOk.setClickable(false);
btnChecked.setClickable(true);
btnAlert.setClickable(true);
tvOk.setBackgroundColor(Color.GREEN);
btnChecked.setBackgroundColor(Color.WHITE);
btnAlert.setBackgroundColor(Color.WHITE);
subStatus[position]="Ok";
}
....
Then when you submit you can go through these status items and see what was clicked or not.
来源:https://stackoverflow.com/questions/10269463/preserve-state-of-elements-inside-listviews-each-row