2012-04-27 122 views
3

我正在爲每個行使用TextView和1個刪除按鈕。如何動態刷新ListView?

要填充列表,我使用自定義適配器(擴展基本適配器)和sqlite數據庫映射到列表。

我的要求是點擊刪除按鈕在一行記錄應該被刪除,列表應刷新。

我能夠從數據庫中刪除記錄,但我的列表不刷新,直到我旋轉設備或從活動分配適配器的新實例。

我試過以下answer ,但沒有在我的情況下工作。這個答案和我的情況之間的區別是我使用baseAdapter和他使用cursorAdapter。

public class BookmarksPDFAdapter extends BaseAdapter { 

      public View getView(int position, View convertView, ViewGroup parent) { 
      openDatabase(); 




      btnDelete.setOnClickListener(new OnClickListener() { 

       @Override 
       public void onClick(View v) { 

        deleteBookmark(getLocation(v));//getlocation(View) method returns which delete button clicked 
        notifyDataSetChanged(); 

       } 
      }); 
     } 
     closeDatabase(); 
     return convertView; 
    } 

我的活動看起來像

public class BookmarkActivity extends Activity { 


@Override 
protected void onCreate(Bundle savedInstanceState) { 
    // TODO Auto-generated method stub 

    super.onCreate(savedInstanceState); 
    setContentView(R.layout.bookmarks); 
    btnEdit = (Button) findViewById(R.id.edit_bookmarks); 
    btnAdd = (Button) findViewById(R.id.add_bookmarks); 

    list = (ListView) findViewById(android.R.id.list); 

    adapter = new BookmarksPDFAdapter(this); 

    list.setAdapter(adapter); 
} 

bookmark.xml

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:weightSum="10.0" 
android:paddingTop="5dp"> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 

    android:padding="3dip" 
    android:layout_alignParentLeft="true" 
    android:weightSum="1.0" 
    android:layout_marginRight="5dip"> 

    <ImageView 
     android:id="@+id/iconShow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/delete_icon" 
     android:visibility="invisible" 
     android:layout_weight="1.0"/> 
</LinearLayout> 

<TextView 
    android:id="@+id/bookmark_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="6dp" 
    android:layout_weight="7.0" 
    android:gravity="center_horizontal|center_horizontal" 
    android:lines="1" 
    android:text="@+id/TextView01" 
    android:textSize="24dp" /> 

<Button 
    android:id="@+id/btnDelete" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="right" 
    android:layout_weight="2.0" 
    android:text="@string/btn_txt_delete" 
    android:visibility="invisible" > 
</Button> 

listitem.xml

<LinearLayout 
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:orientation="horizontal" 
android:weightSum="10.0" 
android:paddingTop="5dp"> 

<LinearLayout 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:orientation="vertical" 

    android:padding="3dip" 
    android:layout_alignParentLeft="true" 
    android:weightSum="1.0" 
    android:layout_marginRight="5dip"> 

    <ImageView 
     android:id="@+id/iconShow" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:src="@drawable/delete_icon" 
     android:visibility="invisible" 
     android:layout_weight="1.0"/> 
</LinearLayout> 

<TextView 
    android:id="@+id/bookmark_text" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_marginTop="6dp" 
    android:layout_weight="7.0" 
    android:gravity="center_horizontal|center_horizontal" 
    android:lines="1" 
    android:text="@+id/TextView01" 
    android:textSize="24dp" /> 

<Button 
    android:id="@+id/btnDelete" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_gravity="right" 
    android:layout_weight="2.0" 
    android:text="@string/btn_txt_delete" 
    android:visibility="invisible" > 
</Button> 

deleteBookmark方法

void deleteBookmark(int wantedChild) { 

    String bookmarkItem = getBookmarkItemText(wantedChild, true); 
    datasource.open(); 
    int check = datasource.deleteBookmark(bookmarkItem); 
    if (check == 1) { 

     btnDelete = (Button) (viewList.get(wantedChild) 
       .findViewById(R.id.btnDelete)); 

     btnDelete.setText(R.string.btn_txt_deleted); 
     btnDelete.setEnabled(false); 
    } 

    datasource.close(); 
} 

在這裏,我從我的數據庫中刪除記錄,並從改變刪除按鈕的文字刪除刪除

+0

什麼deleteBookmark辦? – JRaymond 2012-04-27 16:49:52

回答

7
adapter.notifyDataSetChanged(); 

您可以撥打上面的方法隨時刷新列表視圖。在你的情況下,從數據庫中刪除記錄後調用它。

+0

他已經在調用notifyDataSetChanged() – 2012-04-27 16:51:20

+0

你的數組列表在哪裏設置爲適配器? – 2012-04-27 16:56:15

+0

是的,我的猜測是當它調用notifyDataSetChanged()時,它還沒有從適配器使用的數組中移除。需要看到deleteBookmark的代碼 – ootinii 2012-04-27 17:01:05

0

我通過調用更新列表視圖:
listview.invalidateViews();

+0

不工作:(。 – Bhimbim 2013-11-01 02:47:35

0
notifyDataSetChanged(); 

是我唯一的解決辦法現在還我deleteBookmark方法看起來像

void deleteBookmark(int wantedChild, String bookmarkItem) { 

    openDatabase(); 
    int check = datasource.deleteBookmark(bookmarkItem); 
    if(check==1) 
    Toast.makeText(context, R.string.msg_bookmark_delete, ReaderConstants.TOAST_SHOWTIME).show(); 
    else 
     Toast.makeText(context, R.string.msg_bookmark_delete_failed, ReaderConstants.TOAST_SHOWTIME).show(); 
    notifyDataSetChanged(); 
    closeDatabase(); 
}