ListView Adapter中的Android OnClickListener更改了另一行

 mobiledu2502904157 发布于 2023-02-07 18:26

我的列表视图是这样的(每行4个TextViews):

我点击了B1和D3

当我点击B1和D3时,它们变成了灰色(这很好!).
但是当我滚动时,我发现另外两个TextView也变成了灰色,尽管我没有点击它们.我没有点击B11和D13

我的自定义适配器是:

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

希望这可以帮助 !

1 个回答
  • 这是因为视图的回收!标记应该可以解决您的问题.这是一个非常常见的问题,请看:

    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

    希望这可以帮助 !

    2023-02-07 18:28 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有