【问题标题】:How to delete item from ListView while using Custom ArrayAdapter w/ Dialog使用带对话框的自定义 ArrayAdapter 时如何从 ListView 中删除项目
【发布时间】:2019-04-23 18:26:19
【问题描述】:

一些上下文:我有一个 ListView 的自定义 ArrayAdapter,它有 3 个参数名称、编辑按钮、删除按钮。我在 ArrayAdapter 中设置了onClicks,以便能够检测按下特定的编辑/删除按钮正在单击哪个配置文件。当用户删除配置文件时,我从SQLite DB 中删除了配置文件,但是现在我遇到了尝试使用已删除的项目更新ArrayList 并为我的ListView 更新notifyDataSetChanged 的问题。

问题 1:我不知道我是否应该在包含 ListView 和 ArrayList 的类中执行此操作,或者我是否应该尝试从 onClicks 中的 ArrayAdapter 进行更新。

问题 2:无论哪种方法可能是正确的,当用户在对话框中确认删除时,如何正确更新 ListView 中已删除的项目。

当前的 ArrayAdapter 类

public class ListViewItemAdapter extends ArrayAdapter<ListViewItem>
{
    private Context mContext;
    private List<ListViewItem> list = new ArrayList<>();
    private DatabaseHelper databaseHelper;
    private String profileName;

    public ListViewItemAdapter(@NonNull Context context, ArrayList<ListViewItem> listItem) {
    super(context, 0 , listItem);
    mContext = context;
    list = listItem;
}

@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
    View listItem = convertView;
    if(listItem == null)
        listItem = LayoutInflater.from(mContext).inflate(R.layout.custom_listview,parent,false);

    final ListViewItem listViewItem = list.get(position);

    //Text View Profile
    final TextView name = (TextView) listItem.findViewById(R.id.textView_name);
    name.setText(listViewItem.getmName());
    profileName = listViewItem.getmName();

    //Edit Button Profile
    ImageButton image = listItem.findViewById(R.id.imageView_poster);
    image.setImageResource(listViewItem.getmImageDrawable());
    image.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            Toast.makeText(mContext,
                    "Edit Profile:" + listViewItem.getmProfile() + " Name:" + listViewItem.getmName(),
                    Toast.LENGTH_SHORT).show();
        }
    });


    //Delete Button Profile **Currently Testing**
    ImageButton image2 = listItem.findViewById(R.id.imageView_poster2);
    image2.setImageResource(listViewItem.getmImageDrawable2());
    image2.setOnClickListener(new View.OnClickListener()
    {
        @Override
        public void onClick(View v)
        {
            databaseHelper = new DatabaseHelper(getContext());

            Toast.makeText(mContext,
                    "Delete Profile:" + listViewItem.getmProfile() + " Name:" + listViewItem.getmName(),
                    Toast.LENGTH_SHORT).show();
            AlertDialog.Builder builder = new AlertDialog.Builder(getContext(),R.style.AlertDialogTheme);

            builder.setTitle("Delete Profile?")
                    .setMessage("Are you sure you want to delete\n" + listViewItem.getmName())
                    .setPositiveButton("yes", new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                            databaseHelper.deleteRowProfile(listViewItem.getmName());

                            //
                            //This is where I'm try to update the ListView
                            //

                        }
                    })
                    .setNegativeButton(android.R.string.no, new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {
                        }
                    })
                    .show();
        }
    });


    return listItem;
}
}

Fragment 类中填充 ListView onViewCreated 的函数

public void getProfileList()
{
    arrayList = new ArrayList<ListViewItemAdapter>();
    listViewItemAdapter = new ListViewItemAdapter(getContext(),arrayList);

    Cursor result = databaseHelper.getAllDataCarProfile();

    if(listViewItemAdapter != null){
        listViewItemAdapter.clear();
        listViewItemAdapter.notifyDataSetChanged();
    }

    if (result.getCount() != 0)
    {
        while (result.moveToNext())
        {
            arrayList.add(new ListViewItem("CarProfile",
                    result.getString(0),
                    R.drawable.ic_edit_gray_24dp,
                    R.drawable.ic_delete_grey_24dp));
        }
        listViewItemAdapter.notifyDataSetChanged();
    }

    listViewCarProfile.setAdapter(listViewItemAdapter);

}

【问题讨论】:

    标签: android listview android-arrayadapter custom-arrayadapter


    【解决方案1】:

    你可以用任何一种方式来做到这一点。您可以在您的适配器类中创建一个函数并在其上执行 clickListener。

    deleteItem.setOnClickListener(v -> {
                potsList.remove(getAdapterPosition());
                notifyDataSetChanged();
     }
    

    或者在你的班级中,当从列表中删除项目时,不要忘记通知适配器。适配器收到通知后,将在屏幕上反映更改。

    【讨论】:

    • 这是否意味着我必须使 ArrayList 可供 ArrayAdapter 类访问,还是可以访问它,因为从技术上讲它仍然在屏幕的上下文中?如果是这样,我会怎么做,因为现在这不起作用,因为我的 ArrayList 不在 ArrayAdapter 类中
    • 工作代码正在添加:list.remove(listViewItem); 然后 notifyDataSetChanged() 正如 Mini Chip 指出的那样。没有意识到 ArrayAdapter 中的 List 从 Class 中的 ArrayList 中获取属性。感谢您的帮助!
    猜你喜欢
    • 1970-01-01
    • 2015-06-26
    • 2011-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-22
    • 2015-06-26
    • 1970-01-01
    相关资源
    最近更新 更多