У меня есть следующий код в моем адаптере. Каждый элемент состоит из двух изображений, а под ними - флажок для каждого изображения. Я хочу отобразить список этих элементов, но при прокрутке вверх и вниз кажется, что первый и последний элементы одинаковы. И затем через некоторое время другие предметы также будут не в порядке. Я рассмотрел другие вопросы по этой проблеме, и я не смог найти, почему мои элементы ListView перетасовываются после прокрутки вниз и вверх.ListView элементы перетасовки при прокрутке
@Override
public View getView(final int position, View convertView, ViewGroup parent){
View view = convertView;
if(view == null){
viewHolder = new ViewHolder();
LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
view = inflater.inflate(R.layout.wheel_list_item, null);
viewHolder.decisionNum = (TextView)view.findViewById(R.id.decisionNumText);
viewHolder.leftWheel = (ImageView)view.findViewById(R.id.leftWheel);
viewHolder.rightWheel = (ImageView)view.findViewById(R.id.rightWheel);
viewHolder.leftCheckBox = (CheckBox)view.findViewById(R.id.leftCheckBox);
viewHolder.rightCheckBox = (CheckBox)view.findViewById(R.id.rightCheckBox);
viewHolder.wheelTuple = list.get(position);
view.setTag(viewHolder);
}
else{
viewHolder = (ViewHolder)view.getTag();
}
viewHolder.decisionNum.setText(Integer.toString(position + 1));
viewHolder.leftCheckBox.setClickable(false);
viewHolder.rightCheckBox.setClickable(false);
viewHolder.leftWheel.setImageBitmap(new WheelView(context, viewHolder.wheelTuple.left).getBitmapReduced());
viewHolder.rightWheel.setImageBitmap(new WheelView(context, viewHolder.wheelTuple.right).getBitmapReduced());
int id = context.getResources().getIdentifier("GREY", "color", context.getPackageName());
int colorId=context.getResources().getColor(id);
if(!viewHolder.wheelTuple.left.isChosen()){
viewHolder.leftWheel.setColorFilter(colorId, PorterDuff.Mode.MULTIPLY);
viewHolder.rightCheckBox.setChecked(true);
}
else{
viewHolder.rightWheel.setColorFilter(colorId, PorterDuff.Mode.MULTIPLY);
viewHolder.leftCheckBox.setChecked(true);
}
return view;
}
static class ViewHolder{
TextView decisionNum;
ImageView leftWheel;
ImageView rightWheel;
CheckBox leftCheckBox;
CheckBox rightCheckBox;
WheelListActivity.WheelTuple wheelTuple;
}
Кажется работать. Чтобы я понял код. getViewTypeCount() устанавливает количество ViewTypes. Поэтому в этом случае мы просто делаем каждый элемент в нашем списке другим видом. getItemViewType() просто возвращает тип вида для конкретного индекса. Поскольку каждый индекс списка уникален, элементы нельзя перетасовать? – user2278298
Да, элементы не будут перетасованы. Но будьте осторожны, если вы используете listview для отображения изображений, тогда вы можете получить OutOfMemoryError, поскольку listview создает разные представления для каждого индекса, но сохраняет только видимые виды в памяти. В случае изображений вы используете Picasso для загрузки изображений. –