我使用自定义适配器制作了listview。有五个文本视图,一个复选框和一个按钮。
-------------------------------------
<TextView>
<TextView> <checkbox>
<TextView>
<TextView> <button>
<TextView>
-------------------------------------
我用来填充列表中文本视图的arraylists具有适当的唯一数据。但是listview只需要四到五个开头的值,并在列表的其余部分重复它。
此外,当我滚动显示的值时会自动更改。例如,项目A显示在第一个位置。所以当我向下滚动然后再次出现时,会显示项目C或项目D.
这让我很困惑!请帮忙!
自定义适配器代码
protected class MyCustomAdapter extends ArrayAdapter<String>
{
int len;
private SparseBooleanArray mCheckStates;
private SparseBooleanArray favourites;
ArrayList<String> myMake, myModel, myVer, myPrice, myPlace, sellr_pos;
int count = 0;
ViewHolder holder = null;
Boolean status;
public MyCustomAdapter(Context context, int textViewResourceId,
ArrayList<String> car_make, ArrayList<String> car_model,
ArrayList<String> car_version, ArrayList<String> car_price,
ArrayList<String> car_place, ArrayList<String> sellr_pos) {
super(context, textViewResourceId);
mCheckStates = new SparseBooleanArray(car_model.size());
favourites = new SparseBooleanArray(car_model.size());
myMake = car_make;
myModel = car_model;
myVer = car_version;
myPrice = car_price;
myPlace = car_place;
}
private class ViewHolder {
TextView txt1, txt2, txt3, txt4, txt5;
CheckBox chkbox;
Button btn_fav;
}
@Override
public int getCount() {
return myMake.size();
}
@Override
public View getView(final int position, View convertView,
ViewGroup parent) {
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.text_adaptr, null);
holder = new ViewHolder();
holder.txt1 = (TextView) convertView.findViewById(R.id.text1);
holder.txt2 = (TextView) convertView.findViewById(R.id.text5);
holder.txt3 = (TextView) convertView.findViewById(R.id.text3);
holder.txt4 = (TextView) convertView.findViewById(R.id.text4);
holder.txt5 = (TextView) convertView.findViewById(R.id.text2);
System.out.println("ListView position: " + position);
holder.txt1.setText(myMake.get(position));
holder.txt2.setText(myModel.get(position));
holder.txt3.setText(myVer.get(position));
holder.txt4.setText(myPrice.get(position));
holder.txt5.setText(myPlace.get(position));
holder.chkbox = (CheckBox) convertView
.findViewById(R.id.checkBox1);
holder.btn_fav = (Button) convertView.findViewById(R.id.fav);
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
holder.chkbox.setTag(position);
holder.chkbox.setChecked(mCheckStates.get(position, false));
if (favourites.get(position, false)) {
holder.btn_fav.setBackgroundResource(R.drawable.star);
} else {
holder.btn_fav.setBackgroundResource(R.drawable.star_grey);
}
len = fav_ids.size();
System.out.println("FAV_IDS len:" + len);
for (int t = 0; t < len; t++) {
String pos_id = pos.get(position).trim();
String fav_id = fav_ids.get(t).trim();
if (pos_id.equals(fav_id)) {
holder.btn_fav.setBackgroundResource(R.drawable.star);
break;
} else {
holder.btn_fav.setBackgroundResource(R.drawable.star_grey);
}
}
holder.chkbox.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Do something
}
});
holder.btn_fav.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
// Do something
}
});
return convertView;
}
}
答案 0 :(得分:3)
将值设置为
处的TextViewif (convertView == null) {
....code...
........../.
/*
you are setting values here
remove it from here
*/
holder.txt1.setText(myMake.get(position));
holder.txt2.setText(myModel.get(position));
holder.txt3.setText(myVer.get(position));
holder.txt4.setText(myPrice.get(position));
holder.txt5.setText(myPlace.get(position));
}
else
{
....code...
}
/*
Set values here
it will solve the problem
*/
holder.txt1.setText(myMake.get(position));
holder.txt2.setText(myModel.get(position));
holder.txt3.setText(myVer.get(position));
holder.txt4.setText(myPrice.get(position));
holder.txt5.setText(myPlace.get(position));
它解决了我的问题