2017-04-09 4 views
0

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); 
} 
} 
+0

Haben Sie versucht, ein Tag mit der 'setTag' Methode zu setzen? – MashukKhan

Antwort

0

view.getId() Versuchen Sie, die ID des angeklickten Ansicht zu erhalten. Das Argument id ist die Zeilen-ID. Siehe AdapterView.OnItemLongClickListener.

onItemLongClick

boolean onItemLongClick (AdapterView Eltern, Ansicht Ansicht, int Position, long id)

Callback-Methode aufgerufen werden, wenn ein Element in dieser Ansicht angeklickt wurde und gehaltenen. Implementierer können getItemAtPosition (position) aufrufen, wenn sie auf die mit dem ausgewählten Element verbundenen Daten zugreifen müssen.

Parameter

Mutter AdapterView: Die AbsListView wo der Klick

Ansicht Ansicht passiert: Die Ansicht im AbsListView die

Position int geklickt wurde: Die Position der Ansicht in der Liste

id lang: Die Zeilen-ID des Elements, auf das geklickt wurde

Verwandte Themen