2012-04-27 94 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(); 
}