2
我用自定義適配器做了一個listview。有五個文字瀏覽,一個複選框和一個按鈕。自定義listView重複值並在滾動上更改它們
-------------------------------------
<TextView>
<TextView> <checkbox>
<TextView>
<TextView> <button>
<TextView>
-------------------------------------
我用來填充列表中textview的arraylist具有適當的唯一數據。但是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;
}
}
爲什麼不製作一個自定義的POJO類的適配器,像類MyCustomAdapter擴展ArrayAdapter,其中CarInfo將是一個持有String對象(模型,版本,價格等)的類?它會簡化你的代碼,你甚至不需要在你的構造函數中使用6 ArrayList 。只是一個設計建議;-) –
2Dee
是的,你是對的!但是現在它已經變得太大和複雜了......我的時間很少......但是我一定會在稍後嘗試改進它 – User3