2013-02-12 88 views
0

我有一個列表視圖,它有一個textview和一個圖像按鈕(刪除)。當我點擊圖像按鈕時,行被刪除,列表視圖得到更新。刪除自定義ListView中的行

一切工作正常,但問題是當列表視圖中有更多的一行,刪除一行後,我不能刪除另一個,因爲位置值不合適。

說清楚,例如:在列表視圖中有3行。

  • 我點擊第一行刪除(位置值是0),它就會被刪除,列表視圖更新。

所以現在有兩排,

  • 我再次點擊第一行,並無法刪除。(bcoz位置值是沒有得到與列表視圖更新,實際上現在它的位置值應該是0,而是其表示圖1及有時2)

這是我的代碼,

CustomListView.class

public View getView(final int position, View convertView, ViewGroup parent) { 
    holder = null; 
    DataFields rowItems = (DataFields) getItem(position); 
    LayoutInflater inflater = (LayoutInflater) context 
      .getSystemService(Activity.LAYOUT_INFLATER_SERVICE); 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.home_field_row, null); 
     holder = new ViewHolder(); 
     holder.dataFields = items.get(position); 
     holder.mName = (TextView) convertView 
       .findViewById(R.id.hmFieldName); 
     holder.mDeleteImage = (ImageView) convertView 
       .findViewById(R.id.hmFieldDeleteImage); 
     holder.mDeleteImage.setTag(position); 

     holder.mDeleteImage 
       .setOnClickListener(new ImageView.OnClickListener() { 

        @Override 
        public void onClick(final View v) { 
         Log.d("POSITION****", String.valueOf(position)); 
         final Integer index = (Integer) v.getTag(); 

         holder.dataFields = items.get(position); 
         value = holder.dataFields.getId(); 

         int status = dbHandler 
           .deleteField(holder.dataFields); 

         if (status != 0) { 
          items.remove(index.intValue()); 
          notifyDataSetChanged(); //ListView is getting updated but not the position values of rows 
         } else { 
          Toast.makeText(getContext(), 
            "Failed to delete !", 
            Toast.LENGTH_SHORT).show(); 

         } 
        } 
       }); 

     convertView.setTag(holder); 
    } 

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

    holder.mName.setText(rowItems.getName()); 

    return convertView; 
} 

任何形式的幫助,非常感謝。謝謝 !

編輯

正如大家說的,我做了以下的變化,但仍然是位置值不會得到更新...

holder.dataFields = items.get(position); 
DataFields obj = items.get(position); 
value = holder.dataFields.getId(); 

int status = dbHandler.deleteField(holder.dataFields); 
if (status != 0) { 
    items.remove(index.intValue()); 
    HomeActivity.mAdapter.remove(obj); //I also tried items.remove(obj); 
    HomeActivity.mAdapter.notifyDataSetChanged(); 
} else { 
    Toast.makeText(getContext(), "Failed to delete !", Toast.LENGTH_SHORT).show(); 
} 

回答

1

你刪除的部分後,你應該通知你使用適配器notifyDataSetChanged()

更新

我認爲這是因爲你使用視圖的標記作爲你的索引,這樣你的索引不會改變。你應該使用標記final int position

編輯

可以嘗試下面的代碼,而不是

int status = dbHandler.deleteField(items.get(position)); 
if (status != 0) { 
    items.remove(position); 
    notifyDataSetChanged(); 
} else { 
    Toast.makeText(getContext(), "Failed to delete !", Toast.LENGTH_SHORT).show(); 
} 
+0

我這樣做,看在我的代碼註釋行。刪除項目後,我使用notifyDataSetChanged()更新了列表視圖。 – 2013-02-12 11:53:07

+0

我更新了我的回答 – 2013-02-12 11:56:22

+0

我沒有得到你想要解釋的是什麼。你能爲我提供代碼行嗎? – 2013-02-12 12:02:58

0

您已經創建DataFields類,你張貼編輯一個由getView方法提供的索引保存記錄。因此,從數組列表或散列表中刪除任何對象(無論您使用的是什麼),並在從列表中刪除任何對象後,在代碼下面寫下代碼。

adapter.notifyDataSetChanged(); 

在這裏,適配器是您的自定義適配器。

編輯

public class Contants extends Application 
{ 
    public int xyz; 
} 

,如果你喜歡使用這個xyz對象,你只是單純的需要編寫,

((Contants) getApplicationContext()).xyz; 
+0

但是我不能直接在我的CustomListView的class Rite中使用我的MainActivity的類的適配器??有沒有辦法做到這一點? – 2013-02-12 11:55:01

+0

你知道'Application'類嗎?看到我編輯的答案。 – 2013-02-12 12:09:22

0

試試這個:

//Using the position we can 
Object obj = adapter.getItem(position); 
adapter.remove(obj); 
//Notify the adapter 
adapter.notifyDataSetChanged(); 
+0

但該適配器是我的MainActivity類。我如何通知我的CustomListView類中的同一個適配器? – 2013-02-12 11:56:54

+0

檢查此鏈接:http://stackoverflow.com/questions/7831395/android-how-to-delete-a-row-from-a-listview-with-a-delete-button-in-the-row – user1744952 2013-02-12 12:02:15

0

我認爲這可能是因爲你正在刪除一個項目,但它仍然在ViewHolder中,所以你應該在刪除後更新你的ViewHolder DataFields。

0

嘗試刪除後重置適配器:

list.remove(adapter.getSelectedIndex()); 
reloadList(); 


    /** 
* Fixes bug where the list doesn't update. Call instead of just calling 
* notifyDataSetChanged. 
*/ 
private void reloadList(){ 
    adapter.notifyDataSetChanged(); 
    getListView().setAdapter(adapter); 
}