Ich versuche das Löschen aus der Datenbank mithilfe der Kontextaktionsleiste zu implementieren. Als ich OnItemLongClickListener zum Abrufen der ID des angeklickten Elements implementierte, wurde stattdessen der Positionswert zurückgegeben. Hier ist der Code. Dies ist meine erste Frage, so entschuldigen Sie bitte etwaige TippfehlerWie erhält man die ID eines angeklickten Elements in ListView?
public class ChecklistActivity extends AppCompatActivity{
ListDBHelper mHelper;
private long currentListItemIndex;
public int ids;
private CLAdapter mAdapter;
public ArrayList<String> taskList;
ListView lv;
private static final String TAG = "CheckListActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mHelper=new ListDBHelper(this);
setContentView(R.layout.activity_checklist);
mAdapter=new CLAdapter(this,R.layout.activity_checklist_item,R.id.check_textView,taskList);
lv=(ListView) findViewById(R.id.item_listView);
final Bundle extras=getIntent().getExtras();
if(extras!=null){
ids=(int)extras.getLong("key_id");
}
updateUI((int)extras.getLong("key_id"));
Button addButton =(Button)findViewById(R.id.addButton);
addButton.setOnClickListener(new View.OnClickListener(){
public void onClick(View view){
EditText addTask =(EditText)findViewById(R.id.addTask);
String list = String.valueOf(addTask.getText());
SQLiteDatabase db = mHelper.getWritableDatabase();
ContentValues values = new ContentValues();
values.put(ListContract.CheckListEntry.COLUMN_NAME_TITLE, list);
values.put(ListContract.CheckListEntry.COLUMN_LIST_KEY,(int)extras.getLong("key_id"));
db.insertWithOnConflict(ListContract.CheckListEntry.TABLE_NAME,
null,
values,
SQLiteDatabase.CONFLICT_REPLACE);
db.close();
addTask.setText("");
updateUI((int)extras.getLong("key_id"));
}
});
lv.setOnItemLongClickListener(new AdapterView.OnItemLongClickListener(){
@Override
public boolean onItemLongClick(AdapterView<?> parent, View view, int position, long id) {
currentListItemIndex=id;
lv.setItemChecked(position, !mAdapter.isPositionChecked(position));
return false;
}
});}
lv.setChoiceMode(lv.CHOICE_MODE_MULTIPLE_MODAL);
lv.setMultiChoiceModeListener(new AbsListView.MultiChoiceModeListener() {
private int nr = 0;
@Override
public void onItemCheckedStateChanged(ActionMode mode, int position, long id, boolean checked) {
if (checked) {
nr++;
mAdapter.setNewSelection(position, checked);
} else {
nr--;
mAdapter.removeSelection(position);
}
mode.setTitle(nr + " selected");
}
@Override
public boolean onCreateActionMode(ActionMode mode, Menu menu) {
mode.setTitle("Remove Item");
nr = 0;
mode.getMenuInflater().inflate(R.menu.checklist_cab_menu,menu);
return true;
}
@Override
public boolean onPrepareActionMode(ActionMode mode, Menu menu) {
return false;
}
@Override
public boolean onActionItemClicked(ActionMode mode, MenuItem item) {
switch(item.getItemId()){
case R.id.action_delete_item:
nr = 0;
deleteRow((int)currentListItemIndex);
mAdapter.notifyDataSetChanged();
mode.finish();
return true;
}
return false;
}
@Override
public void onDestroyActionMode(ActionMode mode) {
}
});
}
public void updateUI(int keyid){
ListDBHelper mHelper=new ListDBHelper(this);
SQLiteDatabase db= mHelper.getReadableDatabase();
Cursor c= db.rawQuery("SELECT CheckListEntry.*,CheckListEntry._id as _id FROM CheckListEntry WHERE "+
"CheckListEntry.ListKey == "+keyid+";",null);
ArrayList<String> taskList=new ArrayList<>();
while(c.moveToNext()){
int idx=c.getColumnIndex(ListContract.CheckListEntry.COLUMN_NAME_TITLE);
taskList.add(c.getString(idx));
Log.d(TAG,"cursorRead"+c.getString(idx));
}
mAdapter = new CLAdapter(this,
R.layout.activity_checklist_item,
R.id.check_textView,
taskList);
lv.setAdapter(mAdapter);
}
public void deleteRow(int id){
ListDBHelper mHelper = new ListDBHelper(this);
SQLiteDatabase db= mHelper.getWritableDatabase();
db.delete(ListContract.CheckListEntry.TABLE_NAME,"_id =="+id+";",null);
updateUI(ids);
}
}
Haben Sie versucht, ein Tag mit der 'setTag' Methode zu setzen? – MashukKhan