我的列表视图是这样的(每行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; } }
Adnan Mulla.. 6
这是因为视图的回收!标记应该可以解决您的问题.这是一个非常常见的问题,请看:
http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html
listview复选框麻烦在android中
CustomAdapter中的ListView Checkbox问题
http://lalit3686.blogspot.in/2012/06/today-i-am-going-to-show-how-to-deal.html
希望这可以帮助 !
这是因为视图的回收!标记应该可以解决您的问题.这是一个非常常见的问题,请看:
http://www.mysamplecode.com/2012/07/android-listview-checkbox-example.html
listview复选框麻烦在android中
CustomAdapter中的ListView Checkbox问题
http://lalit3686.blogspot.in/2012/06/today-i-am-going-to-show-how-to-deal.html
希望这可以帮助 !