我知道有很多关于同一问题的问题。
我看起来有点奇怪!我有一个ListView的自定义适配器,我传递了Model的ArrayList。我为此列表设置了一个上下文菜单,在单击删除时,我需要从ListView中删除该行(然后刷新)。我正在调用xxxxx.remove(info.position)
然后调用listadapter.notifyDataSetChanged()
,但它复制了ListView中存在的最后一行。
以下是代码:
ListView适配器:
类MyAdapter扩展了ArrayAdapter {
private final Context context;
private final ArrayList<ListModel> itemsArrayList;
public MyAdapter(Context context, ArrayList<ListModel> itemsArrayList) {
super(context, R.layout.viewlistitems, itemsArrayList);
this.context = context;
this.itemsArrayList = itemsArrayList;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View rowView = null;
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
//Get rowView from inflater
rowView = inflater.inflate(R.layout.viewlistitems, parent, false);
}
else
rowView = convertView;
// 3. Get the two text view from the rowView
TextView listNameView = (TextView) rowView.findViewById(R.id.listName);
listNameView.setTypeface(ViewListActivity.segoe);
listDateView.setTypeface(ViewListActivity.openSansLightIt);
String listName1 = itemsArrayList.get(position).getListName();
String listName2 = listName1.substring(0,1).toUpperCase() + listName1.substring(1);
listNameView.setText(listName2);
return rowView;
}
}
文本菜单:
public void onCreateContextMenu(ContextMenu menu, View v,
ContextMenuInfo menuInfo) {
if (v.getId()==R.id.ListView01) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo)menuInfo;
menu.setHeaderTitle(todoItems.get(info.position).getListName());
String[] menuItems = {"Delete"};
for (int i = 0; i<menuItems.length; i++) {
menu.add(Menu.NONE, i, i, menuItems[i]);
}
}
}
public boolean onContextItemSelected(MenuItem item) {
AdapterView.AdapterContextMenuInfo info = (AdapterView.AdapterContextMenuInfo) item
.getMenuInfo();
if(item.getTitle().equals("Delete")) {
Toast.makeText(this,
todoItems.get(info.position).getListName() + " deleted!",
Toast.LENGTH_SHORT).show();
todoItems.remove(info.position);
//newList.invalidateViews();
adapter.notifyDataSetChanged();
}
return true;
}
自1天后无法修复此错误!知道为什么会发生这种情况或导致它的原因吗?
非常感谢!
答案 0 :(得分:1)
而不是:
if (convertView == null) {
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Get rowView from inflater
rowView = inflater.inflate(R.layout.viewlistitems, parent, false);
}
else
rowView = convertView;
试试这个:
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// Get rowView from inflater
rowView = inflater.inflate(R.layout.viewlistitems, parent, false);
并且您还删除了项目,然后不要告诉Adapter类您删除项目,因为适配器项目与temsArrayList
因此,在Adapter类中创建一个方法并传递这个新的arraylist。
private viod methodName(arraylist list)
{
temsArrayList=list;
notifyDataSetChanged();
}
然后您无需致电adapter.notifyDataSetChanged();
致电adapter.methodName(newArraylist)
答案 1 :(得分:0)
好吧,我终于解决了这个问题。
我使用notifyDataSetInvalidated()
使当前适配器无效,并使用我修改的列表设置新适配器。工作得很好。
答案 2 :(得分:0)
我遇到了同样的问题,我从2天开始就在寻找解决方案。 我终于发现它是一个XML问题而不是java问题。 问题出在ListView高度,它的值为&#34; wrap_content&#34;,我将其更改为&#34; match_parent&#34;。问题解决了。 然后我找到了一个更好的解决方案,最好将ListView放在LinearLayout中。
B.objects.filter(a='search_id')
所以我说我的问题是关于身高,希望你的问题,和平。