Android - 从 ListViewAdapter 中删除一个项目然后刷新
Android - Delete an item from ListViewAdapter and then Refresh
我正在尝试从我的 ListViewAdapter 中删除一个项目,我已经实现了我的 setOnItemLongClickListener
这样做:
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Toast.makeText(getActivity(), "On long click listener", Toast.LENGTH_LONG).show();
return true;
}
});
它向我展示了一个 Toast,验证它检测到 onClickListener
,我尝试将其删除:mItems.remove(arg2);
,但没有任何反应......我一直在寻找正确的答案,我发现我必须调用 notifyDataSetChanged()
,但是因为我不能调用这个方法,所以我尝试了这个方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.ofertasRefresh:
mItems.notifyAll();
return true;
default:
return super.onOptionsItemSelected(item);
}
但是没有任何反应,LogCat 上没有错误,没有应用程序崩溃,什么都没有...你们能告诉我我错过了什么吗?
你应该这样做-
// 作为 class 成员
ListViewDemoAdapter myAdapter;
然后在方法中-
myAdapter = new ListViewDemoAdapter(getActivity(), mItems);
setListAdapter(myAdapter);
现在在 onItemClickListener 中,
mItems.remove(arg2);
myAdapter = new ListViewDemoAdapter(getActivity(), mItems);
setListAdapter(myAdapter);
请注意,这不是最佳解决方案,但它应该适合您的情况。
第一步是将您的适配器存储在一个成员变量中,以便您稍后可以再次访问它。
不要调用 setListAdapter(new ListViewDemoAdapter(getActivity(), mItems));
,而是将 Fragment 更改为如下所示:
public class MyFragment extends ListFragment {
private Adapter mListAdapter;
@Override
public voidonCreate(Bundle savedInstanceState) {
mListAdapter = new ListViewDemoAdapter(getActivity(), mItems);
setListAdapter(mListAdapter);
}
}
然后当您删除一个项目时,您可以调用 mListAdapter.notifyDataSetChanged()
这样列表就知道它需要重新绘制。
notifyAll()
isn't remotely close to notifyDataSetChanged()
.
您需要像这样在 activity 中声明您的全局适配器:
ListViewDemoAdapter adapter;
放:
adapter = new ListViewDemoAdapter(getActivity(), mItems));
setListAdapter(adapter);
而不是:
setListAdapter(new ListViewDemoAdapter(getActivity(), mItems));
当您删除项目时,您应该致电:
adapter.notifyDataSetChanged();
我正在尝试从我的 ListViewAdapter 中删除一个项目,我已经实现了我的 setOnItemLongClickListener
这样做:
getListView().setOnItemLongClickListener(new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
int arg2, long arg3) {
Toast.makeText(getActivity(), "On long click listener", Toast.LENGTH_LONG).show();
return true;
}
});
它向我展示了一个 Toast,验证它检测到 onClickListener
,我尝试将其删除:mItems.remove(arg2);
,但没有任何反应......我一直在寻找正确的答案,我发现我必须调用 notifyDataSetChanged()
,但是因为我不能调用这个方法,所以我尝试了这个方法:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.ofertasRefresh:
mItems.notifyAll();
return true;
default:
return super.onOptionsItemSelected(item);
}
但是没有任何反应,LogCat 上没有错误,没有应用程序崩溃,什么都没有...你们能告诉我我错过了什么吗?
你应该这样做-
// 作为 class 成员
ListViewDemoAdapter myAdapter;
然后在方法中-
myAdapter = new ListViewDemoAdapter(getActivity(), mItems);
setListAdapter(myAdapter);
现在在 onItemClickListener 中,
mItems.remove(arg2);
myAdapter = new ListViewDemoAdapter(getActivity(), mItems);
setListAdapter(myAdapter);
请注意,这不是最佳解决方案,但它应该适合您的情况。
第一步是将您的适配器存储在一个成员变量中,以便您稍后可以再次访问它。
不要调用 setListAdapter(new ListViewDemoAdapter(getActivity(), mItems));
,而是将 Fragment 更改为如下所示:
public class MyFragment extends ListFragment {
private Adapter mListAdapter;
@Override
public voidonCreate(Bundle savedInstanceState) {
mListAdapter = new ListViewDemoAdapter(getActivity(), mItems);
setListAdapter(mListAdapter);
}
}
然后当您删除一个项目时,您可以调用 mListAdapter.notifyDataSetChanged()
这样列表就知道它需要重新绘制。
notifyAll()
isn't remotely close to notifyDataSetChanged()
.
您需要像这样在 activity 中声明您的全局适配器:
ListViewDemoAdapter adapter;
放:
adapter = new ListViewDemoAdapter(getActivity(), mItems));
setListAdapter(adapter);
而不是:
setListAdapter(new ListViewDemoAdapter(getActivity(), mItems));
当您删除项目时,您应该致电:
adapter.notifyDataSetChanged();