【问题标题】:ListView Items get mixed, when Onclick当 Onclick 时,ListView 项目混合在一起
【发布时间】:2015-03-24 08:28:38
【问题描述】:

我遇到了一个烦人的问题,ListView 项目的值混在一起!

我有一个带有 TextView(带有适配器视图)和 Onclicklistner ImageView 的简单 ListView,当我单击 ImageView 时,textview 的值会发生变化。

但是当我上下滚动时,值会混合,所以有点烦人。

我一直在寻找解决方案,发现名为“View Holder”的解决方案我也尝试过,但我遇到了同样的问题,这是我的适配器视图代码:

public class adapter extends ArrayAdapter<statisticitem> {

    int likes;

    public adapter(Context context, ArrayList<statisticitem> questionaires) {
        super(context, 0, questionaires);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom, parent, false);

            holder = new ViewHolder();
            holder.text1 = (TextView) convertView.findViewById(R.id.textView1);
            holder.button = (ImageView) convertView.findViewById(R.id.imageView1);
            holder.text2 = (TextView) convertView.findViewById(R.id.textView2);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final statisticitem s = getItem(position);

        if (s != null) {
            holder.text1.setText(s.getIdQuestion());
            holder.button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    likes++;
                    holder.text2.setText("yasser");
                }
            });
        }
        return convertView;
    }
}

和我的视图持有者类:

public class ViewHolder {
    TextView text1;
    TextView text2;
    ImageView button;
}

【问题讨论】:

  • when I scroll up and down, the values get mixed 请解释发生了什么
  • 比如我点击第一项的ImageView,textview的值发生变化,上下滚动的时候发现其他item的textview也发生了变化
  • ok 试试 ViewGroup rowView=(ViewGroup)v.getParent();((TextView)rowView.findViewById(R.id.textView2)).setText("yasser"); 而不是 holder.text2.setText("yasser");
  • 谢谢,但有语法错误

标签: android listview android-listview android-viewholder


【解决方案1】:

在适配器类中,您正在编写一个 if 条件来检查 's' 是否为 null 或不编写 else 条件

if (s !=null)
   {
       holder.text1.setText(s.getIdQuestion());

       holder.button.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                likes++;
            holder.text2.setText("yasser"); 

            }
     });


   }
else
{

//write something to the text view
 holder.text1.setText("");
 holder.text2.setText("");    

}

检查是否有帮助!!!

【讨论】:

  • 谢谢,但我有同样的问题
  • 你的 textview 1 或 textview2 是否被洗牌了..或两者兼而有之?
  • 谢谢你们!但我总是面临同样的问题
  • 如果您认为您的适配器类是错误的,您可以查看buzzingandroid.com/tools/android-layout-finder,它将为您创建一个适配器类..只需提供您的 .xml 给它提供名称它将创建你上课。有时间可以看看
【解决方案2】:

改写成

public class adapter extends ArrayAdapter<statisticitem> {

    int likes;

    public adapter(Context context, ArrayList<statisticitem> questionaires) {
        super(context, 0, questionaires);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        final ViewHolder holder;
        final statisticitem s = getItem(position);

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom, parent, false);

            holder = new ViewHolder();
            holder.text1 = (TextView) convertView.findViewById(R.id.textView1);
            holder.button = (ImageView) convertView.findViewById(R.id.imageView1);
            holder.text2 = (TextView) convertView.findViewById(R.id.textView2);
            convertView.setTag(holder);
            if (s != null) {
                holder.text1.setText(s.getIdQuestion());
                holder.button.setOnClickListener(new OnClickListener() {

                    @Override
                    public void onClick(View v) {
                        likes++;
                        holder.text2.setText("yasser");
                    }
                });
            } else {
                holder.text1.setText("");
            }
        } else {
            holder = (ViewHolder) convertView.getTag();
            if (s != null) {
                holder.text1.setText(s.getIdQuestion());
            } else {
                holder.text1.setText("");
            }
        }

        return convertView;
    }

}

您需要设置一次OnClickListener,因为getView 方法执行的频率超出了您的预期。

我建议你把likes 像一个

public class ViewHolder {
    TextView text1;
    TextView text2;
    ImageView button;
    int likes;
}

OnClickListener

holder.likes++;
holder.text2.setText("yasser");

而不是

likes++;
holder.text2.setText("yasser");

【讨论】:

  • 它不起作用:您仅在创建视图时设置值。 if (s != null ... 部分必须在 return 句子之前。
  • @JuanjoVega 是的,我设置了一次,因为这是 ViewHolder 模式的含义。
  • @JuanjoVega 但你说得对,如果存在转换视图,我错过了检查块。
  • 谢谢你们!但我总是面临同样的问题
【解决方案3】:

我从头开始了一个项目,添加并稍微修改了您的代码,经过测试......终于得到了这个:

统计项目

public class statisticitem {
    String id;

    public statisticitem(String id) {
        this.id = id;
    }

    public String getIdQuestion() {
        return id;
    }
}

适配器

public class Adapter extends ArrayAdapter<statisticitem> {
    int[] likes;

    public Adapter(Context context, ArrayList<statisticitem> questionaires) {
        super(context, 0, questionaires);

        likes = new int[questionaires.size()];
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        final ViewHolder holder;

        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.itemview, parent, false);

            holder = new ViewHolder();
            holder.text1 = (TextView) convertView.findViewById(R.id.tvText1);
            holder.button = (Button) convertView.findViewById(R.id.btButton);
            holder.text2 = (TextView) convertView.findViewById(R.id.tvText2);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        final statisticitem s = getItem(position);

        if (s != null) {
            holder.text1.setText(s.getIdQuestion());
            holder.text2.setText(likes[position] > 0 ? "yasser" : "");

            holder.button.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    likes[position]++;
                    notifyDataSetChanged();
                }
            });
        }
        return convertView;
    }

    public class ViewHolder {
        TextView text1;
        TextView text2;
        Button button;
    }
}

主要活动

public class MainActivity extends ActionBarActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lvItems = (ListView) findViewById(R.id.lvItems);

        // Build data.
        ArrayList<statisticitem> questionaires = new ArrayList<statisticitem>();
        for (int i = 0; i < 50; i++) {
            questionaires.add(new statisticitem(String.valueOf(i)));
        }

        // Display items.
        Adapter adapter = new Adapter(this, questionaires);
        lvItems.setAdapter(adapter);
    }
}

布局:

activity_main

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <ListView
        android:id="@+id/lvItems"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</RelativeLayout>

项目视图

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" >

    <LinearLayout
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="3"
        android:orientation="vertical" >

        <TextView
            android:id="@+id/tvText1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />

        <TextView
            android:id="@+id/tvText2"
            android:layout_width="match_parent"
            android:layout_height="wrap_content" />
    </LinearLayout>

    <Button
        android:id="@+id/btButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:text="like" />
</LinearLayout>

【讨论】:

  • 谢谢你们!但我总是面临同样的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-12
相关资源
最近更新 更多