【发布时间】:2018-03-29 14:15:14
【问题描述】:
调用 .notifyDataSetChanged() 时,我的适配器出现问题。它显示了错误的项目
问题:
我的ArrayList 中保存了 3 个项目:项目 1、项目 2 和项目 3。例如,当我使用 .remove(Index) 删除项目 1 时,项目 1 被删除,但在调用 notifyDataSetChanged() 之后,我的 ListView 是显示:第 1 项和第 2 项,最后一个没有显示,即使我的 ArrayList 仅包含第 2 项和第 3 项。
下面的代码和输出:
public boolean onItemLongClick(AdapterView<?> adapterView, View view, int i, long l) {
final int indexToDelete = i;
Log.i("indexToDelete", Integer.toString(i));
for (int ji = 0; ji < items.size(); ji ++ ) {
Log.i("ItemInside",items.get(ji).getItemName());
}
AlertDialog.Builder builder = new AlertDialog.Builder(UserSimplePlusNoteActivity.this);
builder.setTitle("Do you want to delete this note?");
builder.setPositiveButton("Yes", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialogInterface, int i) {
final Item toDelete = items.get(indexToDelete);
String noteToDelete = toDelete.getItemName();
items.remove(indexToDelete);
for (int ji = 0; ji < items.size(); ji ++ ) {
Log.i("ItemInside2",items.get(ji).getItemName());
}
customAdapter.notifyDataSetChanged();
删除前的日志输出:
03-29 14:00:19.118 23457-23457/com.example.user.testingapp I/indexToDelete: 0
03-29 13:47:08.202 22165-22165/com.example.user.testingapp I/ItemInside: Test 1
03-29 13:47:08.202 22165-22165/com.example.user.testingapp I/ItemInside: Test 2
03-29 13:47:08.202 22165-22165/com.example.user.testingapp I/ItemInside: Test 3
删除后:
03-29 13:47:08.202 22165-22165/com.example.user.testingapp I/ItemInside: Test 2
03-29 13:47:08.202 22165-22165/com.example.user.testingapp I/ItemInside: Test 3
这是我的适配器和项目:
public class CustomAdapter extends BaseAdapter {
private Context context;
private ArrayList<Item> items;
public CustomAdapter(Context context, ArrayList<Item> items) {
this.context = context;
this.items = items;
}
@Override
public int getCount() {
return items.size();
}
@Override
public Object getItem(int i) {
return items.get(i);
}
@Override
public long getItemId(int i) {
return i;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
if(view == null) {
view = LayoutInflater.from(context).inflate(R.layout.custom_adapter, parent, false);
Item currentItem = (Item) getItem(position);
TextView textViewItemName = view.findViewById(R.id.titleID);
TextView textViewItemDescription = view.findViewById(R.id.detailID);
ImageView imageView = view.findViewById(R.id.imgID);
textViewItemName.setText(currentItem.getItemName());
textViewItemDescription.setText(currentItem.getItemDescription());
switch (currentItem.getPriority()) {
case 1:
break;
case 2:
imageView.setImageResource(R.drawable.priority_urgent_icon);
break;
case 3:
imageView.setImageResource(R.drawable.priority_important_icon);
break;
default:
Log.i("Ok", "Something strange happend");
}
}
return view;
}
}
项目:
public class Item {
private String itemName;
private String itemDescription;
private int priority;
public Item(String name, String description, int priority) {
this.itemName = name;
this.itemDescription = description;
this.priority = priority;
}
public String getItemName() {
return this.itemName;
}
public String getItemDescription() {
return this.itemDescription;
}
public int getPriority() {
return this.priority;
}
}
【问题讨论】:
-
在您的
customAdapter中打印items并在此处发布结果 -
您在
Adapter的getView()方法中没有正确处理事情。即使view不为空,您仍然需要在Views 上设置文本和图像。使用您当前的方法,您应该在if(view == null)中做的唯一一件事就是膨胀项目布局。您只需将}正上方的return语句移动到view = ...行之后。 -
@MikeM。你是对的,已经解决了,谢谢你的帮助
标签: java android custom-adapter