0

Я реализовал простой метод для удаления нескольких элементов из списка, следуя этому решению Removing muliple items from listview using Check box in Android, а затем немного изменил его, чтобы разрешить оператор switch для двух событий нажатия кнопок, add & delete. Но проблема в том, что я нажимаю кнопка удаления, с которой произошли ошибки приложения: http://pastebin.com/2NmCQk2BКак удалить несколько выбранных позиций из списка?

Я не уверен, почему я получаю исключение нулевого указателя, поскольку, как я полагаю, я все правильно присвоил.

Может кто-нибудь лучше объяснить, почему я могу получить эту ошибку? Или, возможно, лучший способ удаления выбранных позиций из списка?

Полный класс размещен ниже для лучшего понимания:

public class TopRatedFragment extends Fragment implements OnClickListener { 

    ListView mListView; 
    EditText mValue; 
    Button mAdd,mDel; 
    ArrayList<String> list = new ArrayList<String>(); 
    ArrayAdapter<String> adapter; 
    SparseBooleanArray mCheckStates ; 


    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_top_rated, container, false); 
     mAdd = (Button)rootView.findViewById(R.id.newList); 
     mDel = (Button)rootView.findViewById(R.id.delBtn); 
     mAdd.setOnClickListener(this); 
     mDel.setOnClickListener(this); 
     mValue = (EditText)rootView.findViewById(R.id.listData); 
     adapter = new ArrayAdapter<String>(getActivity(), android.R.layout.simple_expandable_list_item_1, list); 

    // set the lv variable to your list in the xml 
     mListView=(ListView)rootView.findViewById(R.id.listView); 
     mListView.setAdapter(adapter); 


     return rootView;  
    } 


    public void onClick(View v) 
    { 
     switch(v.getId()){ 
     case R.id.newList: 
      //DO something 
      String input = mValue.getText().toString(); 
      if(input.length() > 0) 
      { 
       // add string to the adapter, not the listview 
       adapter.add(input); 
       // no need to call adapter.notifyDataSetChanged(); as it is done by the adapter.add() method 
      } 
     break; 
     case R.id.delBtn: 
      //DO something 
      SparseBooleanArray checked = mListView.getCheckedItemPositions(); 
      for (int i = 0; i < mListView.getCount(); i++){ 

       //line 65 
       if (checked.get(i)==true) 
       { 
        list.remove(i); 

       } 
       adapter.notifyDataSetChanged(); 

      } 
      mListView.clearChoices();    
     } 


    } 

} 

Listview/Interface

+1

что нас линии 65? – Raghunandan

+0

это 'if (checked.get (i) == true)' –

+0

как вы заполняете список. я думаю, его пустой – Raghunandan

ответ

1

Вы должны использовать valueAt(), рабочий код должен быть

SparseBooleanArray checkedItems = mListView.getCheckedItemPositions(); 
if (checkedItems != null) { 
    for (int i=0; i<checkedItems.size(); i++) { 
     if (checkedItems.valueAt(i)) { 
      String item = mListView.getAdapter().getItem(
            checkedItems.keyAt(i)).toString(); 
      Log.i(TAG,item + " was selected"); 
     } 
    } 
} 
1

Удалить из адаптера, а не из ListView попробовать следующее:

SparseBooleanArray checked = mListView.getCheckedItemPositions(); 

    if(checked!=null){ 
    for (int i = 0; i < mListView.getCount(); i++){ 

      //line 65 
      if (checked.get(i)==true) 
      { 
       adapter.remove(mListView.getItemAtPosition(i)); 

      } 
      adapter.notifyDataSetChanged(); 

     } 
     mListView.clearChoices(); 
    } 

getCheckedItemPositions Возвраты: SparseBooleanArray, который будет return true для каждого вызова, чтобы получить (int position), где позиция - это проверенное положение в lis t и false иначе, или null, если для режима выбора установлено значение CHOICE_MODE_NONE.

+0

почему бы 'if (checked.get (i) == true)' line 65 throw NPE ?? – Raghunandan

+0

check for null before for loop –

+0

checked уже инициализирован. – Raghunandan

0

Я использовал петлю таким образом, и это сработало:

SparseBooleanArray checkedItemPositions = getListView().getCheckedItemPositions(); 
       int itemCount = getListView().getCount(); 

       for(int i=itemCount-1; i >= 0; i--){ 
        if(checkedItemPositions.get(i)){ 
         adapter.remove(list.get(i)); 
        } 
       } 
       checkedItemPositions.clear(); 
       adapter.notifyDataSetChanged(); 
Смежные вопросы