如何动态刷新 ListView?
Posted
技术标签:
【中文标题】如何动态刷新 ListView?【英文标题】:How to refresh ListView dynamically? 【发布时间】:2012-05-08 10:35:37 【问题描述】:我正在制作一个 ListView,其中包含 TextView 和每行 1 个删除按钮。
为了填充列表,我使用我的自定义适配器(扩展基本适配器)和 sqlite db 映射到列表中。
我的要求是单击一行中的删除按钮,应删除记录并刷新列表。
我可以从数据库中删除记录,但我的列表不会刷新,直到我旋转设备或从活动中分配我的适配器的新实例。
我已经尝试关注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);
书签.xml
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal"
android:weightSum="10.0"
android:paddingTop="5dp">
<LinearLayout
android:layout_
android:layout_
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_
android:layout_
android:src="@drawable/delete_icon"
android:visibility="invisible"
android:layout_weight="1.0"/>
</LinearLayout>
<TextView
android:id="@+id/bookmark_text"
android:layout_
android:layout_
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_
android:layout_
android:layout_gravity="right"
android:layout_weight="2.0"
android:text="@string/btn_txt_delete"
android:visibility="invisible" >
</Button>
listitem.xml
<LinearLayout
android:layout_
android:layout_
android:orientation="horizontal"
android:weightSum="10.0"
android:paddingTop="5dp">
<LinearLayout
android:layout_
android:layout_
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_
android:layout_
android:src="@drawable/delete_icon"
android:visibility="invisible"
android:layout_weight="1.0"/>
</LinearLayout>
<TextView
android:id="@+id/bookmark_text"
android:layout_
android:layout_
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_
android:layout_
android:layout_gravity="right"
android:layout_weight="2.0"
android:text="@string/btn_txt_delete"
android:visibility="invisible" >
</Button>
删除书签方法
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();
我正在从我的数据库中删除记录并将删除按钮的文本从 delete 更改为 deleted
【问题讨论】:
【参考方案1】:adapter.notifyDataSetChanged();
您可以随时调用上述方法刷新列表视图。在您从数据库中删除记录后调用它。
【讨论】:
要设置为适配器的数组列表在哪里? 是的,我猜它还没有从适配器调用 notifyDataSetChanged() 时使用的数组中删除。需要查看 deleteBookmark 的代码 我怀疑他是否在 deleteBookmark 中异步执行任何操作。不过,如果 list.postDelayed( /* New Runnable 确实通知数据集 changed() */, 200); @agrawal 我没有使用 arrayList 我有我的数据库,我从中获取书签。 谢谢大家,我遇到了这个问题。我在适配器的构造函数中初始化光标,因为我的列表没有刷新,但现在我面临其他问题。我也在单独的问题中发布。【参考方案2】:我通过调用更新列表视图:
listview.invalidateViews();
【讨论】:
【参考方案3】: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();
【讨论】:
【参考方案4】:在适配器内部设置更新数据集的自定义方法并通知更改
public void updateData(ArrayList<DataSet> d)
this.data = d;
notifyDataSetChanged();
然后调用Activity内部的方法, (对于我的情况,我在 onResume 方法中调用)
@Override
public void onResume()
super.onResume();
adapter.updateData(dataList);
【讨论】:
以上是关于如何动态刷新 ListView?的主要内容,如果未能解决你的问题,请参考以下文章