我的列表视图是这样的(每行4个TextViews):
当我点击B1和D3时,它们变成了灰色(没关系!)
但是当我滚动时,我发现其他两个TextView也变成了灰色,虽然我没有点击它们。
我的自定义适配器是:
public class MyAdapter extends BaseAdapter {
private Context cont;
private int count;
public MyAdapter (Context c, int numberOfRow) {
this.cont = c;
this.count = numberOfRow;
}
@Override
public int getCount() {
return count;
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@SuppressLint("NewApi")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = convertView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) cont.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.single_row, null);
ViewHolder hold = new ViewHolder();
hold.tv1 = (TextView) v.findViewById(R.id.radio1);
hold.tv2 = (TextView) v.findViewById(R.id.radio2);
hold.tv3 = (TextView) v.findViewById(R.id.radio3);
hold.tv4 = (TextView) v.findViewById(R.id.radio4);
v.setTag(hold);
}
final ViewHolder holder = (ViewHolder) v.getTag();
holder.tv1.setText("A " + position);
holder.tv2.setText("B " + position);
holder.tv3.setText("C " + position);
holder.tv4.setText("D " + position);
OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
//Transparent background
Drawable dr1 = cont.getResources().getDrawable(R.drawable.radio_box);
//Grey background
Drawable dr2 = cont.getResources().getDrawable(R.drawable.filled_radio_box);
//Set Transparent background to all
holder.tv1.setBackground(dr1);
holder.tv2.setBackground(dr1);
holder.tv3.setBackground(dr1);
holder.tv4.setBackground(dr1);
//Set Grey background only to the TextView which is clicked
switch (v.getId()) {
case R.id.radio1:
holder.tv1.setBackground(dr2);
break;
case R.id.radio2:
holder.tv2.setBackground(dr2);
break;
case R.id.radio3:
holder.tv3.setBackground(dr2);
break;
case R.id.radio4:
holder.tv4.setBackground(dr2);
break;
}
}
};
holder.tv1.setOnClickListener(ocl);
holder.tv2.setOnClickListener(ocl);
holder.tv3.setOnClickListener(ocl);
holder.tv4.setOnClickListener(ocl);
return v;
}
static class ViewHolder {
public TextView tv1;
public TextView tv2;
public TextView tv3;
public TextView tv4;
}
}
如果需要其他代码,请告诉我。
编辑:最终解决方案: 适配器类
public class MyAdapter extends BaseAdapter {
static class ViewHolder {
public TextView tv1;
public TextView tv2;
public TextView tv3;
public TextView tv4;
}
private Context cont;
private int count;
private Problem[] problem;
public MyAdapter (Context c, Problem[] pr) {
this.cont = c;
this.problem = pr;
this.count = pr.length;
}
@Override
public int getCount() {
return count;
}
@Override
public Object getItem(int arg0) {
return null;
}
@Override
public long getItemId(int position) {
return 0;
}
@SuppressLint("NewApi")
@Override
public View getView(int position, View convertView, ViewGroup parent) {
final ViewHolder holder;
View v = convertView;
if (v == null) {
LayoutInflater inflater = (LayoutInflater) cont.
getSystemService(Context.LAYOUT_INFLATER_SERVICE);
v = inflater.inflate(R.layout.single_row, null);
holder = new ViewHolder();
holder.tv1 = (TextView) v.findViewById(R.id.radio1);
holder.tv2 = (TextView) v.findViewById(R.id.radio2);
holder.tv3 = (TextView) v.findViewById(R.id.radio3);
holder.tv4 = (TextView) v.findViewById(R.id.radio4);
final int POS = position;
OnClickListener ocl = new OnClickListener() {
@Override
public void onClick(View v) {
TextView tv = (TextView) v;
Problem prb = (Problem) tv.getTag();
Log.d("onClick", String.valueOf(prb.getPos()));
Drawable dr1 = cont.getResources().getDrawable(R.drawable.radio_box);
Drawable dr2 = cont.getResources().getDrawable(R.drawable.filled_radio_box);
holder.tv1.setBackground(dr1);
holder.tv2.setBackground(dr1);
holder.tv3.setBackground(dr1);
holder.tv4.setBackground(dr1);
switch (v.getId()) {
case R.id.radio1:
prb.setClicked(1);
holder.tv1.setBackground(dr2);
break;
case R.id.radio2:
prb.setClicked(2);
holder.tv2.setBackground(dr2);
break;
case R.id.radio3:
prb.setClicked(3);
holder.tv3.setBackground(dr2);
break;
case R.id.radio4:
prb.setClicked(4);
holder.tv4.setBackground(dr2);
break;
}
Log.d("onClick", String.valueOf(prb.getClicked()));
}
};
holder.tv1.setOnClickListener(ocl);
holder.tv2.setOnClickListener(ocl);
holder.tv3.setOnClickListener(ocl);
holder.tv4.setOnClickListener(ocl);
v.setTag(holder);
} else {
holder = (ViewHolder) v.getTag();
}
Drawable dr1 = cont.getResources().getDrawable(R.drawable.radio_box);
Drawable dr2 = cont.getResources().getDrawable(R.drawable.filled_radio_box);
Problem pal = problem[position];
holder.tv1.setText(pal.getA());
holder.tv2.setText(pal.getB());
holder.tv3.setText(pal.getC());
holder.tv4.setText(pal.getD());
holder.tv1.setBackground(dr1);
holder.tv2.setBackground(dr1);
holder.tv3.setBackground(dr1);
holder.tv4.setBackground(dr1);
Log.d("log", "pos = " + position + " clicked = " + pal.getClicked());
switch (pal.getClicked()) {
case 1:
holder.tv1.setBackground(dr2);
break;
case 2:
holder.tv2.setBackground(dr2);
break;
case 3:
holder.tv3.setBackground(dr2);
break;
case 4:
holder.tv4.setBackground(dr2);
break;
default:
break;
}
holder.tv1.setTag(pal);
holder.tv2.setTag(pal);
holder.tv3.setTag(pal);
holder.tv4.setTag(pal);
return v;
}
}
问题类:
public class Problem {
private String A;
private String B;
private String C;
private String D;
private int pos;
private int clicked;
public Problem(int n) {
this.pos = n;
this.A = "A " + n;
this.B = "B " + n;
this.C = "C " + n;
this.D = "D " + n;
this.clicked = -1;
}
public int getClicked() {
return clicked;
}
public void setClicked(int clicked) {
this.clicked = clicked;
}
public String getA() {
return A;
}
public void setA(String a) {
A = a;
}
public String getB() {
return B;
}
public void setB(String b) {
B = b;
}
public String getC() {
return C;
}
public void setC(String c) {
C = c;
}
public String getD() {
return D;
}
public void setD(String d) {
D = d;
}
public int getPos() {
return pos;
}
public void setPos(int pos) {
this.pos = pos;
}
}
答案 0 :(得分:6)
这是因为视图的回收!标记应该可以解决您的问题。这是一个非常常见的问题,请看:
http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html
listview checkbox trouble in android
ListView Checkbox problem in CustomAdapter
http://lalit3686.blogspot.in/2012/06/today-i-am-going-to-show-how-to-deal.html
希望这有帮助!
答案 1 :(得分:0)
您需要一个变量来跟踪要在列表项中突出显示的TextView
。
您可以将该变量添加到Holder
对象或使用SparseIntArray
之类的内容来存储position
作为键,将0,1,2,3,4作为值存储确定选择了哪个TextView
。 0
表示没有选择。最初,SparseIntArray
position
中的变量或条目将为0
。
接下来,在getView()
查找position
的值作为SparseIntArray
中的键,并根据该值设置TextView
的背景以标记选择(如果有)。
这样,当您滚动ListView
时,它只会显示您选择的列表项的选择,而不会显示其他列表项的选择。