0

У меня есть список с адаптером custon. Я макет строки, у меня есть текст и флажок. Когда я загружаю listview, я получаю данные из базы данных, и у нее есть одна колунма, которая определяет, была ли строка пробита или нет. Когда я загружаю список, его нормально, строки, которые должны оставаться отмеченными, остаются checkd, а остальные нет. Проблема заключается в следующем: когда я откручиваю строку и свертываю список вниз и вверх, когда я возвращаюсь к началу, строка, которую я снял, снова проверяется, как я могу перепродать эту проблему:Как сделать CheckBox в ListView?

getView() код ниже:

public View getView(int index, View view, ViewGroup parent) { 

    if (view == null) { 
     LayoutInflater inflater = LayoutInflater.from(parent.getContext()); 
     view = inflater.inflate(R.layout.linha_acessorios, parent, false);    
    }  

    final AcessoriosItensLista acessorios = (AcessoriosItensLista)getItem(index); 

    final ImageView imgAcessorio = (ImageView)view.findViewById(R.id.imgAcessorioLista);    

    final CheckBox cb = (CheckBox)view.findViewById(R.id.cbListaAcessorios); 
    TextView tvNome = (TextView) view.findViewById(R.id.tvNomeAcessoriosLinha); 
    tvNome.setText(acessorios.getNomeAcessorio());  

    final Integer iditem = Integer.valueOf(acessorios.getId()); 

    boolean ch = acessorios.isChecked(); 

    final Integer position = Integer.valueOf(index); 

    if(ch){ 
     if(!checked.contains(iditem)){ 
      checkedPositions.add(position); 
      checked.add(iditem); 
     } 
    }    

    cb.setOnClickListener(new OnClickListener() {   
     @Override 
     public void onClick(View v) { 
      if(checked.contains(iditem)){ 
       checked.remove(iditem); 
       checkedPositions.remove(position); 
      } 

      if (((CheckBox) v).isChecked()) {     
       checkedPositions.add(position);  
       checked.add(iditem); 
       int id = context.getResources().getIdentifier("acc_gold_"+acessorios.getId(), "drawable", context.getPackageName()); 
       imgAcessorio.setBackgroundResource(id);      
      } 
      else if(checkedPositions.contains(position)) { 
       checkedPositions.remove(position); 
       checked.remove(iditem); 
       int id = context.getResources().getIdentifier("acc_"+acessorios.getId(), "drawable", context.getPackageName()); 
       imgAcessorio.setBackgroundResource(id);      
      }     
     } 
    }); 

    if(checkedPositions.contains(position)){ 
     cb.setChecked(true);  
     int id = context.getResources().getIdentifier("acc_gold_"+acessorios.getId(), "drawable", context.getPackageName()); 
     imgAcessorio.setBackgroundResource(id);       
    } else { 
     cb.setChecked(false); 
     int id = context.getResources().getIdentifier("acc_"+acessorios.getId(), "drawable", context.getPackageName()); 
     imgAcessorio.setBackgroundResource(id);    
    }    

    return view; 
} 
+2

использовать пользовательский listView для проектирования нужного макета – Saqib

+0

Я использую CustonAdapter. – Roland

+0

@Roland это потому, что listvire перерабатывает представления. проверьте это http://stackoverflow.com/questions/18162931/android-get-selected-item-using-checkbox-in-listview-when-i-click-a-button – Raghunandan

ответ

1

это почти как это ваши элементы списка повторного redered или воссозданы, когда они выходят за пределы экрана, теперь самое простое и очевидное решением здесь является, чтобы вызвать событие, когда ваш флажок щелкнул так сделать onclick в вашем адаптере, который запускается, когда флажок установлен или снят флажок, и обновляет источник данных.

2

Я полагаю, что, возможно, вы не отметили то, что CheckBox, но вы не сохраняете его статус в любом месте, поэтому, когда эта строка исчезает с экрана, прокручивая ее и прокручивая вниз, она снова загружает данные из базы данных и он проверяется в нем. Я не знаю, как вы обрабатываете расширение ArrayAdapter, но я рекомендую сохранить конструктор ArrayList в качестве экземпляра внутри класса, обновив это значение внутри него и снимите флажок, и вызовите notifyDataSetChanged().

---- EDIT ----

Чтобы сохранить ArrayList внутри вашего класса, вам придется создать отдельный класс (с двумя полями вы работаете на), например, :

class MyRow { 
    CheckBox cb; 
    TextView tv; 
} 

Так что, когда вы объявите свой собственный адаптер в вашей деятельности, вы должны объявить ранее в ArrayList с некоторыми начальными элементами (или даже пустой):

ArrayList<MyRow> myList = new ArrayList<MyRow>(); 

MyRow row1 = new MyRow(); 
row1.cb.isChecked(...); 
row1.tv.setText(...); 
myList.add(row1); 

Затем вызывается конструктор вашего класса адаптера, что-то вроде этого:

MyArrayAdapter adapter = new MyArrayAdapter(context, R.layout.your_layout, myList);

Итак, когда вы передать его в конструкторе класса адаптера, вы сохраните копию в этом классе:

public class MyArrayAdapter extends ArrayAdapter { 
    final private ArrayList<MyRow> myContent; 
    ... 

    MyArrayAdapter(Context context, int my_layout, ArrayList<MyRow> myContent_) { 
    ... 
    myContent = myContent_ 
    } 
} 

Итак, любой контент, который вы меняете (например, отметьте или сняли флажок), вы должны сохранить его состояние в массиве myContent. Вы найдете этот предмет на getItem(position) в своем getView() и внесите необходимые изменения. После этого вам просто нужно вызвать метод notifyDataSetChanged();, и он автоматически отобразит изменения в вашем ListView.

+0

Знаете ли вы, как я могу это сделать? – Roland

+0

Смотрите мое редактирование, надеюсь, что это поможет! – nKn