我正面临一个烦人的问题,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;
}
答案 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>