2016-06-08 7 views
0

목록보기에서 항목을 길게 누르면 상황 별 액션 막대가 나타납니다. 이제 내가 원하는 항목을 선택한 후 삭제 버튼을 누르면 선택한 항목이 삭제되지만 선택한 항목의 위치를 ​​가져올 수 없습니다.작업 모드에서 선택된 항목의 위치 가져 오기

listViewMessages.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
listViewMessages.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

    @Override 
    public void onItemCheckedStateChanged(ActionMode mode, int position, 
             long id, boolean checked) { 
     mode.setTitle(listViewMessages.getCheckedItemCount()+ " Selected"); 

    } 

    @Override 
    public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { 
     switch (item.getItemId()) { 
      case R.id.menu: 
       deleteScreenedMessageFromInbox();          
        mode.finish(); 
       return true; 
      default: 
       return false; 
     } 
    } 

    @Override 
    public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
     // Inflate the menu for the CAB 
     MenuInflater inflater = mode.getMenuInflater(); 
     inflater.inflate(R.menu.contextual, menu); 
     return true; 
    } 


    @Override 
    public void onDestroyActionMode(ActionMode mode) { 

    } 

    @Override 
    public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
     return false; 
    } 
}); 

내가이 메소드가 호출되어 삭제 버튼을 클릭하면 : 다중 선택 모드에 대한 나의 코드는

deleteScreenedMessageFromInbox(); 

그리고 난의 위치입니다이 방법에 인수를 전달해야 선택한 항목. 이 메소드의 코드는 다음과 같습니다.

public void deleteScreenedMessageFromInbox(Integer position) { 

Integer id = smsIDs.get(position); 

String deleteScreenedMessage = "delete from " + "sms" + " where " + "id" + " = " + id; 

DBsms smsDb = new DBsms(this); 
SQLiteDatabase dbw = smsDb.getWritableDatabase(); 
dbw.execSQL(deleteScreenedMessage); 
dbw.close(); 

이 모든 해결책은 무엇입니까?

+0

당신은 유지할 수있는'ArrayList를 ' 아이템의'MultiChoiceModeListener' 및'add' 외부에서 아이템을 삭제하거나 아이템을'remove'합니다 'boolean checked'가 참인지 거짓인지에 따라'onItemCheckedStateChanged' 내부의'ArrayList'로부터' 이 질문을 대답으로 확대 시키길 원한다면 알려주십시오. –

+0

예 조금 혼란스러워서 샘플 코드를 제공해주십시오. –

+0

기존 코드를 약간 수정하여 답변으로 게시했습니다. 확인해주십시오. –

답변

1

에 대한

내가 제안 것입니다

public void deleteScreenedMessageFromInbox() { 

    DBsms smsDb = new DBsms(this); 
    SQLiteDatabase dbw = smsDb.getWritableDatabase(); 

    for(int position : positionsList) { 
     Integer id = smsIDs.get(position); 

     String deleteScreenedMessage = "delete from " + "sms" + " where " + "id" + " = " + id; 
     dbw.execSQL(deleteScreenedMessage); 
    } 
    dbw.close(); 
} 
+0

천재입니다. 그것은 매력처럼 작동합니다 Thankyou :) –

+0

기꺼이 도와 드릴 수 있습니다. :) –

0

onitemclickListener를 구현하고 항목 ID를 가져 와서 변수에 저장하고 사용자가 delete 및 다음 호출을 클릭 할 때마다 항목을 삭제합니다. adapter.notifyDataSetChanged();

당신의 deleteScreenedMessageFromInbox() 액세스 positionsList에 그런
List<Integer> positionsList = new ArrayList<>();//declare this as a member variable--outside of any method 
listViewMessages.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE_MODAL); 
listViewMessages.setMultiChoiceModeListener(new MultiChoiceModeListener() { 

@Override 
public void onItemCheckedStateChanged(ActionMode mode, int position, 
            long id, boolean checked) { 
    mode.setTitle(listViewMessages.getCheckedItemCount()+ " Selected"); 
    if(checked) 
     positionsList.add(position) 
    else 
     positionsList.remove(position) 
} 

@Override 
public boolean onActionItemClicked(final ActionMode mode, MenuItem item) { 
    switch (item.getItemId()) { 
     case R.id.menu: 
      deleteScreenedMessageFromInbox();          
       mode.finish(); 
      return true; 
     default: 
      return false; 
    } 
} 

@Override 
public boolean onCreateActionMode(ActionMode mode, Menu menu) { 
    // Inflate the menu for the CAB 
    MenuInflater inflater = mode.getMenuInflater(); 
    inflater.inflate(R.menu.contextual, menu); 
    return true; 
} 


@Override 
public void onDestroyActionMode(ActionMode mode) { 

} 

@Override 
public boolean onPrepareActionMode(ActionMode mode, Menu menu) { 
    return false; 
} 
}); 

과 같이 : 예

여기
listViewMessages.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> adapter, View v, int position, 
          long arg3) { 
     //you can pass position from here to your method like this 
     deleteScreenedMessageFromInbox(position) 


     String value = (String) adapter.getItemAtPosition(position); 
     adapter.remove(value); 
     adapter.notifyDataSetChanged();    
    } 
}); 
+0

정수 인수를 메서드에 전달해야합니다. 조치 모드에서 무엇을 작성합니까? 그 방법으로 가치를 전달하는 방법 –

+0

편집 된 답변 확인 – ManishMenaria

+0

작동하지 않습니다. 삭제 버튼을 클릭해도 아무 일도 일어나지 않습니다. –

관련 문제