【问题标题】:custom adapter showing wrong items显示错误项目的自定义适配器
【发布时间】: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

App screen is showing this

这是我的适配器和项目:

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 并在此处发布结果
  • 您在AdaptergetView() 方法中没有正确处理事情。即使view 不为空,您仍然需要在Views 上设置文本和图像。使用您当前的方法,您应该在if(view == null) 中做的唯一一件事就是膨胀项目布局。您只需将} 正上方的return 语句移动到view = ... 行之后。
  • @MikeM。你是对的,已经解决了,谢谢你的帮助

标签: java android custom-adapter


【解决方案1】:

在这种情况下,notifyDataSetChanged() 似乎没有正确刷新。用新的items 刷新customAdapter 并将其设置为listView,即notifyDataSetChanged() 之前的这两行可以解决问题:

customAdapter = new CustomAdapter(getApplicationContext(), items);
listView.setAdapter(customAdapter);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2015-04-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多