Onclick时,ListView项目混合在一起

时间:2015-03-24 08:28:38

标签: android listview android-listview android-viewholder

我正面临一个烦人的问题,ListView项目的价值混合在一起!

我有一个简单的ListView,带有TextView(带适配器视图)和Onclicklistner ImageView,当我点击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;
}

3 个答案:

答案 0 :(得分: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("");    

}

检查是否有帮助!!!

答案 1 :(得分:0)

重写为

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放入ViewHolder,就像

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

OnClickListener

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

而不是

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

答案 2 :(得分:0)

我从头开始创建一个项目,添加并稍微修改了你的代码,经过测试......最后得到了这个:

<强> statisticitem

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>

<强> ItemView控件

<?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>