2016-01-18 235 views
3

我是一個新手,我一直在嘗試開發聯繫人應用程序以及另一個待辦事項應用程序,但這是一個與我的問題有關的問題聯繫人應用。ListView項目的刪除選項總是刪除第一個項目,而不管哪個項目被點擊

插入和查看和刪除功能正常工作,但唯一的問題是,無論我選擇在ListView上刪除哪個項目,它總是刪除最上面的項目。

下面是一些代碼:

MainActivity:

protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     lv=(ListView) findViewById(R.id.listView1); 
     im=(ImageButton) findViewById(R.id.add); 
     ii=(ImageButton) findViewById(R.id.image); 
     list = new ArrayList<HashMap<String,String>>();//memory allocation 
     list = db.getvalues(); 

     ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name}); 
     lv.setAdapter(ad); 
    lv.setOnItemLongClickListener(new OnItemLongClickListener() { 

      @Override 
      public boolean onItemLongClick(AdapterView<?> arg0, View arg1, 
              int arg2, long arg3) { 
       // TODO Auto-generated method stub 
       TextView numtask = (TextView) arg1.findViewById(R.id.name); 
       phnum = numtask.getText().toString(); 
       registerForContextMenu(lv); 
       return false; 
      } 
     }); 


     ii.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View v) { 
       // TODO Auto-generated method stub 
       Intent i =new Intent(MainActivity.this,Main1Activity.class); 
       startActivity(i); 
      } 
     }); 


    } 



    public void onCreateContextMenu(ContextMenu menu, View v, ContextMenuInfo menuInfo) 
    { 
     super.onCreateContextMenu(menu, v, menuInfo); 
     menu.setHeaderTitle("Select The Action"); 
     menu.add(0, v.getId(), 1, "DELETE"); 

    } 

    public boolean onContextItemSelected(MenuItem item){ 


     String number=phnum; 



     if(item.getTitle()=="DELETE"){ 
      TextView id1=(TextView) findViewById(R.id.id); 
      db.deleterow(id1.getText().toString()); 
      Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show(); 
      list = new ArrayList<HashMap<String,String>>();//memory allocation 
      list = db.getvalues(); 

      ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name}); 
      lv.setAdapter(ad); 


    }else{ 
     return false; 
    } 
    return true; 
} 

我不打算增加從SQLiteOpenHelper類擴展DBConnector類,因爲它包含了工作,因爲正在填充數據庫的功能和項目正在被刪除,所以我不認爲這有問題。但是,如果你要我補充一點,我將這樣做,如果你要我......

這裏的custom.xml文件:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="vertical" > 

<TextView 
    android:id="@+id/id" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Small Text" 
    android:textAppearance="?android:attr/textAppearanceSmall" /> 

<TextView 
    android:id="@+id/name" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="Large Text" 
    android:textStyle="bold" 
    android:textAppearance="?android:attr/textAppearanceLarge" /> 

</LinearLayout> 

這裏的deleteRow方法即可withing的DBconnector類:

public void deleterow(String numid) { 


     // TODO Auto-generated method stub 
     SQLiteDatabase sb = this.getWritableDatabase(); 
     String sq = "DELETE FROM user WHERE id="+numid+";"; 
     sb.execSQL(sq); 
    } 

另外,我需要關於如何不能在ListView中顯示id號以及名稱的建議。

請幫幫我吧!我正在爲你們所有人!

+0

你的問題,最有可能的,是在這裏:'TextView的ID1 =(TextView的)findViewById(R.id.id);'假設這個'TextView'是一個'ListView'行,調用'findViewById( )''活動可以返回任何具有該ID的'TextView'小部件,並且每行有一個。上下文菜單已經被認爲已經過時五年了,所以我對它們如何工作的記憶是模糊的。然而,在'onContextItemSelected()'方法中有一個觸發上下文菜單的位置的方法。 – CommonsWare

+0

有沒有其他的菜單可以用來輕鬆找到物品的位置? –

回答

2

您在onContextItemSelected(MenuItem item)方法中調用TextView id1=(TextView) findViewById(R.id.id);方法,因此您將不會返回第一個項目的文本,因爲您尚未給出所選項目的View

解決您的問題是AdapterContextMenuInfo。當爲這個AdapterView提供一個上下文菜單時,它被用於獲取提供給onCreateContextMenu(ContextMenu, View, ContextMenuInfo)回調的額外菜單信息。

你可以得到選中的物品的View,然後在你的情況下從TextView獲得文本。

這裏是修改onContextItemSelected(MenuItem item)方法。

public boolean onContextItemSelected(MenuItem item){ 
     String number=phnum; 
     if(item.getTitle()=="DELETE"){ 
      AdapterContextMenuInfo info = (AdapterContextMenuInfo) item.getMenuInfo(); 
      TextView id1=((TextView) info.targetView).findViewById(R.id.id); 
      db.deleterow(id1.getText().toString()); 
      Toast.makeText(MainActivity.this,"Task Deleted!", Toast.LENGTH_SHORT).show(); 
      list = new ArrayList<HashMap<String,String>>();//memory allocation 
      list = db.getvalues(); 
      ListAdapter ad= new SimpleAdapter(MainActivity.this, list, R.layout.custom, new String[]{"id","name"}, new int[]{R.id.id,R.id.name}); 
      lv.setAdapter(ad); 
     }else{ 
      return false; 
     } 
    return true; 
} 
+0

是的!非常感謝!這工作完美! –

+1

如果它有效,那麼你可以upvote並接受答案 – Rajesh