2016-03-18 2 views
1

У меня есть следующий код в моем адаптере. Каждый элемент состоит из двух изображений, а под ними - флажок для каждого изображения. Я хочу отобразить список этих элементов, но при прокрутке вверх и вниз кажется, что первый и последний элементы одинаковы. И затем через некоторое время другие предметы также будут не в порядке. Я рассмотрел другие вопросы по этой проблеме, и я не смог найти, почему мои элементы 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; 
} 

ответ

4

Вы должны использовать ниже двух функций,

@Override 
    public int getViewTypeCount() { 
     if(searchList.size()==0){ 
      return 1; 
     } 
     return searchList.size(); 
    } 

    @Override 
    public int getItemViewType(int position) { 
     return position; 
    } 

И если ваш dataArrayList оказывает размер 0, то не забудьте вернуть 1 из getViewTypeCount(), в противном случае вы получите ArrayIndexOutOfBoundsException. См. Приведенный выше пример кода.

+0

Кажется работать. Чтобы я понял код. getViewTypeCount() устанавливает количество ViewTypes. Поэтому в этом случае мы просто делаем каждый элемент в нашем списке другим видом. getItemViewType() просто возвращает тип вида для конкретного индекса. Поскольку каждый индекс списка уникален, элементы нельзя перетасовать? – user2278298

+0

Да, элементы не будут перетасованы. Но будьте осторожны, если вы используете listview для отображения изображений, тогда вы можете получить OutOfMemoryError, поскольку listview создает разные представления для каждого индекса, но сохраняет только видимые виды в памяти. В случае изображений вы используете Picasso для загрузки изображений. –

-1

попытаться использовать код:

Addiding GetView() в массиве булевого

 if (mCheckedState[position]) 
        viewHolder.leftCheckBox.setChecked(true); 
       else 
        viewHolder.leftCheckBox.setChecked(false); 

     if (mCheckedState[position]) 
        viewHolder.rightCheckBox.setChecked(true); 
       else 
        viewHolder.rightCheckBox.setChecked(false); 

Объявляет переменную и установить длину:

булевых [] mCheckedState;

public class Adapter_Sandesh extends BaseAdapter { 

     Context context; 
     boolean[] mCheckedState; 
     private LayoutInflater mInflater; 


     public Adapter_Sandesh(FragmentActivity activity, String[] list_margdarshan) { 
      context=activity; 
      mCheckedState = new boolean[<your length>]; 


     } 

     ... 

     ... 

     ... 



    @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); 



    if (mCheckedState[position]) 
       viewHolder.leftCheckBox.setChecked(true); 
      else 
       viewHolder.leftCheckBox.setChecked(false); 

    if (mCheckedState[position]) 
       viewHolder.rightCheckBox.setChecked(true); 
      else 
       viewHolder.rightCheckBox.setChecked(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; 
} 
}