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

标签 android android-listview android-adapter

我的 ListView 是这样的(每行 4 个 TextViews):

I clicked B1 and D3

当我点击 B1 和 D3 时,它们变成灰色(很好!)。
但是当我滚动时,我发现另外两个 TextView 也变成了灰色,尽管我没有点击它们。 I didn't click B11 and 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;
}
}

最佳答案

关于ListView Adapter 中的 Android OnClickListener 更改了另一行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20813018/

相关文章:

java - 安卓UDP通信

java - 在android中解析数据到listview

java - 监听 View (列表标题)onTouch 事件并禁用 ListView 上的滚动

android - android 中的 ScrollView 与 ListView

java - Intent 在 Android 应用程序中隐藏 adview

Android map 扩展出错了

android - 如何捕获android设备屏幕内容?

android - 我如何选择要重用的 convertview?

java - 处理 onClick 事件时 getView 出现空指针异常

java - 您无法在使用 Glide 的回收 View 时启动已销毁 Activity 的加载