2016-06-11 3 views
1

У меня есть таможня ListView, содержащая TextView, ImageView, Checkbox. В ListView ничего не должно быть проверено/снято, поскольку я должен заблокировать его на основе условий.Как сохранить позицию строки/элемента списка?

Задачи, которые я делаю:

  1. Если Checkbox установлен, то он должен показывать изображение в ImageView.

  2. Я не хочу делать CheckBox проверять/включать на основе условий.

Ниже приведен мой код для пользовательского адаптера.

public class CustomAdapter extends BaseAdapter { 

     private Context context; 
     private ArrayList<POJO> mainDataList; 
     private LayoutInflater inflater = null; 

     public CustomAdapter(Context context, ArrayList<POJO> mainDataList) { 
      this.context = context; 
      this.mainDataList = mainDataList; 
      inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     } 

     @Override 
     public int getCount() { 
      // TODO Auto-generated method stub 
      return mainDataList.size(); 
     } 

     @Override 
     public long getItemId(int position) { 
      // TODO Auto-generated method stub 
      return position; 
     } 

     @Override 
     public POJO getItem(int position) { 
      // TODO Auto-generated method stub 
      return mainDataList.get(position); 
     } 

     public class Holder 
     { 
      private TextView name; 
      private ImageView imageView; 
      private CheckBox check; 
     } 

     @Override 
     public View getView(final int position, View view, ViewGroup parent) { 
      // TODO Auto-generated method stub 
      final Holder holder; 
      if (view == null) { 
       holder = new Holder(); 
       view = inflater.inflate(R.layout.my_layout_file, null); 
       holder.name = (TextView) view.findViewById(R.id.textView_Name); 
       holder.imageView = (ImageView) view.findViewById(R.id.img); 
       holder.check = (CheckBox) view.findViewById(R.id.checkBox); 

       view.setTag(holder); 
      } else { 
       holder = (Holder) view.getTag(); 
      } 

      holder.check.setTag(position); 

      if (mainDataList.get(position).isEditable()) { 
        holder.check.setEnabled(false); 
        holder.check.setClickable(false); 
       } else { 
        holder.check.setEnabled(true); 
        holder.check.setClickable(true); 
       } 
      } 

      holder.name.setText(mainDataList.get(position).getName()); 
      holder.check.setChecked(mainDataList.get(position).isSelected()); 

      if (mainDataList.get(position).isSelected()) 
         holder.imageView.setImageResource(R.drawable.ic_launcher); 
      else 
       holder.imageView.setImageResource(null); 

      return view; 
     } 
    } 

Мои проблемы:

  1. На свитке, ImageView показывает изображения в случайном порядке независимо от истинного состояния.

  2. В прокрутке после каждого пункта 4-5 элементов/строк элемент становится недоступным (мое устройство показывает 4-5 ячеек/строк/элементов на экране без прокрутки), поскольку элемент 1 не подлежит проверке. Просто он извлекается в соответствии с механизмом getView().

Я знаю, что это проблема сохранения позиции позиции списка или переустановки ListView в прокрутке. Как это сделать?

+0

@sushildlh Уже попробовал SparseBooleanArray. Пожалуйста, поделитесь конструктивными комментариями – VVB

+1

, которые вы вызываете 'setImageResource' условно: вы должны« очистить »его в разделе' else', также избавиться от этого материала держателя: он только испортил код и его преимущества почти равны нулю – pskink

+0

@ pskink Смотрите мои правки – VVB

ответ

0

У вас есть условие, такие как:

if (mainDataList.get(position).isSelected()) 
      holder.imageView.setImageResource(R.drawable.ic_launcher); 

, что означает, что если модель имеет его свойство выбрано true будет установить некоторые изображения ресурс представление изображения. Проблема кроется в том, что всякий раз, когда вы прокручиваете и isSelected() дает false, вы ничего не делаете. Поскольку вы повторно используете представления, вы получаете несколько старых просмотров, которые в какой-то момент имели значение isSelected(). Он может быть в настоящее время false, но вы не указали никаких условий для этого.

Мое предложение состоит в том, что вы делаете что-то в терминах:

if (mainDataList.get(position).isSelected()) 
{ 
    holder.imageView.setImageResource(R.drawable.ic_launcher); 
} 
else 
{ 
    holder.imageView.setImageResource(null); 
} 
+0

См. мои правки – VVB