当前位置: 首页 > 知识库问答 >
问题:

ListView始终删除最后一项

韦星文
2023-03-14

“我的列表视图”项包含一个“删除”按钮,我在适配器中将其设置为从数据库中删除该项。完成后,如何刷新包含listView的片段以删除该项?相关代码如下:

删除适配器中的项功能:

holder.actionIndicator.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            AlertDialog alertDialog = new AlertDialog.Builder(mContext).create();
            alertDialog.setTitle("Delete item");
            alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "yes",
                    new DialogInterface.OnClickListener() {
                        public void onClick(DialogInterface dialog, int which) {

                            FirebaseMethods firebaseMethods = new FirebaseMethods(mContext);
                            firebaseMethods.deleteHashtagFromDatabase(title);

                            dialog.dismiss();
                        }
                    });
            alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "no",
                    new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            dialog.dismiss();
                        }
                    });


                    alertDialog.show();


        }
    });

listview在我的片段中是这样设置的:

private void setupListView(){

    Log.d(TAG, "setupListView: setting up list");
    final ArrayList<HashTag> hashTags = new ArrayList<>();
    myRef = FirebaseDatabase.getInstance().getReference();
    Query query = myRef.child(getString(R.string.dbname_user_hashtags))
            .child(FirebaseAuth.getInstance().getCurrentUser().getUid());
    query.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot singleSnapshot : dataSnapshot.getChildren()){


                if(singleSnapshot != null){
                    hashTags.add(0, singleSnapshot.getValue(HashTag.class));
                }

            }

            HashTagListViewAdapter adapter = new HashTagListViewAdapter(getActivity(), R.layout.layout_list_itemview, hashTags);
            hashtagListView.setAdapter(adapter);



        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

谢谢

更新:

现在我已经将子项目上的OnClickListener从适配器传递到片段ListView OnItemClickListener,如下所示:

更新适配器

holder.actionIndicator.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {

            ((ListView) parent).performItemClick(v, position, 0);



        }
    });

更新片段

hashtagListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, final int position, long id) {


            long viewId = view.getId();
            Log.d(TAG, "onItemClick: viewId is " + viewId);
            Log.d(TAG, "onItemClick: position is " + position);

            final HashTagListViewAdapter adapter = new HashTagListViewAdapter(getActivity(), R.layout.layout_list_itemview, hashTags);
            final HashTag hashTag = hashTags.get(position);
            final String title = hashTag.getTitle();
            Log.d(TAG, "onItemClick: title is " + title);


            if(viewId == R.id.deleteFromListBtn){

                AlertDialog alertDialog = new AlertDialog.Builder(getActivity()).create();
                alertDialog.setTitle("delete item");
                alertDialog.setButton(AlertDialog.BUTTON_POSITIVE, "yes",
                        new DialogInterface.OnClickListener() {
                            public void onClick(DialogInterface dialog, int which) {

                                FirebaseMethods firebaseMethods = new FirebaseMethods(getActivity());
                                firebaseMethods.deleteHashtagFromDatabase(title);
                                Log.d(TAG, "onClick: title is " + title);

                                // NEW PROBLEM HERE!
                                adapter.remove(hashTag);
                                Log.d(TAG, "onClick: removed hashtag is " + hashTag);
                                adapter.notifyDataSetChanged();

                                Log.d(TAG, "onItemClick: item removed from list.");

                                dialog.dismiss();
                            }
                        });
                alertDialog.setButton(AlertDialog.BUTTON_NEGATIVE, "no",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                dialog.dismiss();
                            }
                        });


                alertDialog.show();


            }
        }
    });

但现在的问题是,当我删除该项时,listView总是删除视图中的最后一项。然而,正确的项目已从数据库中删除,根据日志,此代码适配器。删除(标签)是否抓取了我想要删除的正确项目。

共有2个答案

夏宪
2023-03-14

您应该首先从数据库中删除该项,当成功从数据库中删除该项时,应该从ArrayList中删除该项,并且应该通知适配器ArratList中所做的更改。

从ArrayList表单适配器类中删除项。

//postion is the location of item in the arraylist to be deleted.
dataSet.remove(position);

现在通知适配器ArrayList中的更改。它应该被称为适配器类。

 notifyDataSetChanged();
那谦
2023-03-14

首先,你不应该刷新整个片段。坏习惯

要刷新您的ListView

  1. 首先从ArrayList(名为'hashTags')中删除项。
  2. 然后只需调用YOUR_ADAPTER。

NodefyDataSetChanged()将自动从ListView中删除项。

notifyDataSetChanged()的使用

 类似资料:
  • 我正在一个项目(简单的电话簿)为个人使用。我在删除listview(listView1)中的最后一个剩余项时遇到了麻烦。在这里你可以看看它是什么样子的: 所以,假设我在列表中有5个联系人,当我试图删除所有的联系人时,这是不可能的。只可能移除其中的4个。当我试图删除所有这些联系人,然后关闭/运行应用程序时,将不会有删除的联系人。当我试图删除其中4个并关闭/运行程序时,它们将被删除。当我试图删除最后一

  • 好家伙们,我有一个Web应用程序,在从PrimeFaces Showcase实现了DataTable之后,我意识到通过点击remove a line,它总是会删除DataTable中的第一行,需要一点帮助。 我的DataTable代码: private ArrayList consultasTemp=new ArrayList(); 详细信息视频:在此输入链接描述

  • 我是新来的希望你们能帮我。。。 我是java编程的初学者,我想我对这个问题有点不知所措。 我的程序运行得很好,除了一个让我恼火的小细节。我有一个JTable,第一列有一个按钮,可以从表中删除这一行。它工作得很好,除了当我试图删除表的最后一行时,按钮停留在那里,然后表冻结,我无法删除任何行,因为我收到了一个“越界异常”。但是,当我使用命令表时。getRowCount()); 在删除该行之前和之后,表

  • 问题内容: 我有以下数组。 我想删除最后一个元素,即2。 我用过,但不会删除值。 问题答案: 使用拼接(索引,多个)

  • 我有一个主类,该类将输出打印到控制台。。。 例如,如果行中包含A和B,我需要打印“Apple” 我将在主方法中通过首先实例化该类的对象来实现这一点,即。 代码示例:

  • 问题内容: 当您必须遍历一个集合并用分隔符分隔每个数据的字符串时,总是总是在末尾有一个额外的分隔符,例如 给出类似以下内容: serverId_1,serverId_2,serverId_3, 我想删除StringBuilder中的最后一个字符(不进行转换,因为在此循环之后我仍然需要它)。 问题答案: 其他人指出了该方法,但这是另一种替代方法: 或者,使用Guava中的类:) 从Java 8开始,