2017-10-12 17 views
2

リストビューには多くのアイテムが含まれています。リストビュー項目で複数の削除を行っていますが、リストビューから2番目または3番目の項目だけを選択すると、選択した項目ではなくリストの最初の項目が削除されます。 私はこの男を解決するために手伝ってください。ここリストビューのアイテムを削除する最初のアイテムのみを削除する

/////multiple delete on clicking listview/////// 

    listview.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 

    listview.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() { 

     @Override 
     public void onItemCheckedStateChanged(ActionMode mode, 
               int position, long id, boolean checked) { 
      // Capture total checked items 
      final int checkedCount = listview.getCheckedItemCount(); 

      // Set the CAB title according to total checked items 
      mode.setTitle(checkedCount + " Selected"); 
      // Calls toggleSelection method from ListViewAdapter Class 
      adapter.toggleSelection(position); 

     } 

     @Override 
     public boolean onActionItemClicked(ActionMode mode, MenuItem item) { 
      switch (item.getItemId()) { 
       case R.id.delete: 
        // Calls getSelectedIds method from ListViewAdapter Class 
        SparseBooleanArray selected = adapter.getSelectedIds(); 
        // Captures all selected ids with a loop 
        for (int i = 0; i < (selected.size()); i++) { 
         if (selected.valueAt(i)) { 

          all_memories_getter_setter selecteditem = (all_memories_getter_setter) adapter.getItem(selected.keyAt(i)); 


          getContentResolver().delete(DataProvider.WRITE_URI, DataProvider.ID + '=' + list.get(i).getId(), null); 

          System.out.println("##############values of ss" + list.get(i).getId()); 

          // Remove selected items following the ids 
          adapter.remove(selecteditem); 

         } 

         populateList(); 

        } 
        adapter = new ListViewAdapter(All_memories.this, list); 
        listview.setAdapter(adapter); 


        mode.finish(); 
        return true; 

     default: 
        return false; 
      } 
     } 
    @Override 
     public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
      mode.getMenuInflater().inflate(R.menu.main, menu); 
      return true; 
     } 

     @Override 
     public void onDestroyActionMode(ActionMode mode) { 
      // TODO Auto-generated method stub 
      adapter.removeSelection(); 
     } 

     @Override 
     public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
      // TODO Auto-generated method stub 
      return false; 
     } 
    }); 

そして、私のアダプターのコードです:複数の削除リストビューの項目の ここで私が追加したコードは

は、ここに私のコードです。

public class ListViewAdapter extends BaseAdapter { 

public ArrayList<all_memories_getter_setter>list; 
Activity activity; 

/////**///// multiple delete 
private SparseBooleanArray mSelectedItemsIds; 

public ListViewAdapter(Activity activity, ArrayList<all_memories_getter_setter>list) 
{ 
    super(); 
    mSelectedItemsIds= new SparseBooleanArray(); 
    this.activity=activity; 
    this.list=list; 
} 
@Override 
public int getCount() { 
    return list.size(); 
} 

@Override 
public Object getItem(int position) { 
    return list.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return 0; 
} 


/////**/////// for multiple delete 
public void remove(all_memories_getter_setter object){ 
    list.remove(object); 
    notifyDataSetChanged(); 
} 

public List<all_memories_getter_setter> getall_memories_getter_setter(){ 
    return list; 
} 

public void toggleSelection(int position){ 
    selectView(position, !mSelectedItemsIds.get(position)); 

} 
public void removeSelection(){ 
    mSelectedItemsIds = new SparseBooleanArray(); 
    notifyDataSetChanged(); 
} 

public void selectView(int position , boolean value){ 
    if(value){ 
     mSelectedItemsIds.put(position, value); 
    }else{ 
     mSelectedItemsIds.delete(position); 
     notifyDataSetChanged(); 
    } 

} 
public int getSelectedCount(){ 
    return mSelectedItemsIds.size(); 
} 
public SparseBooleanArray getSelectedIds(){ 
    return mSelectedItemsIds; 
} 



/////**/////// for multiple delete 

public class Viewholder 
{ 
    TextView txtFirst; 
    TextView txtSecond; 
    TextView txtThird; 
} 
@Override 
public View getView(int position, View convertView, ViewGroup parent) { 


    Viewholder holder; 
    LayoutInflater inflater = activity.getLayoutInflater(); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.activity_all_memories_listview, null); 
     holder = new Viewholder(); 

     holder.txtFirst = (TextView) convertView.findViewById(R.id.list_date); 
     holder.txtSecond = (TextView) convertView.findViewById(R.id.list_title); 
     holder.txtThird = (TextView) convertView.findViewById(R.id.list_content); 
     convertView.setTag(holder); 

    } else { 
     holder = (Viewholder) convertView.getTag(); 
    } 

    holder.txtFirst.setText("" + list.get(position).getDate()); 
    holder.txtSecond.setText("" + list.get(position).getTitle()); 
    holder.txtThird.setText("" + list.get(position).getContent()); 
    return convertView; 
} 
} 
+2

リストから削除する必要があります。あなたのリストビューをリフレッシュしてください。アダプター上で 'notifyDataSetChanged()'を呼び出すことによって実現できます。アダプターは1回だけ設定してください。 'populateList()'は何をしますか?あなたもこれらの詳細を投稿する必要があります – Raghunandan

+0

@ Raghunandanよく言われました。 –

+0

populatelist()は私のリストビューアイテム関数です。私がdatを入力すると、リストとして設定されます。 – teddy

答えて

4

getItemId

リスト内の指定された位置に関連付けられている行番号を取得します。

あなたはposition代わりの0を渡す必要があります。

@Override 
public long getItemId(int position) { 
    return 0; // WRONG 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 
+0

ええ、あなたの提案通りにコードを変更しました。しかし、最初の項目を削除するのは – teddy

+0

@teddyなので、CODEをデバッグする必要があります。最初に位置を確認してください。 #Raghunandanのコメントに従ってください。 –

0

変更に特定の位置の代わりに、オブジェクトを取るためにあなたのremoveメソッドを実行しないでください。

public void remove(int position){ 
    list.remove(position); 
    notifyDataSetChanged(); 
} 

および方法が代わりにオブジェクトのIDを渡す呼び出し中で

adapter.remove(i); 

EDIT:あなたがアイテムをクリックしたときに更新されていないスパースブール配列を使用している

SparseBooleanArray selected = adapter.getSelectedIds(); 

この値は常にゼロを返し、選択した項目は常にゼロです。最初の項目は常に削除されます。

+0

はい。変更しました。しかし、最初の項目だけが削除されます – teddy

+0

clickListenerはどこですか?mSelectedItemsIdsをどこで更新していますか? – Anonymous

関連する問題