【问题标题】:ListView always delete the last itemListView 总是删除最后一项
【发布时间】:2017-12-08 03:04:16
【问题描述】:

我的列表视图项目包含一个删除按钮,我在我的适配器中设置它以从数据库中删除该项目。现在一旦完成,我如何刷新包含 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) {

        }
    });

谢谢!

更新:

现在我已将 subItem 上的 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 总是删除视图中的最后一个项目。但是,正确的项目已从数据库中删除,根据日志,此代码 adapter.remove(hashTag) 确实抓住了我打算删除的正确项目。

【问题讨论】:

    标签: android listview android-fragments


    【解决方案1】:

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

    刷新您的ListView

    1. 首先从ArrayList 中删除项目(名为“hashTags”)。
    2. 只需致电YOUR_ADAPTER.notifyDataSetChanged()

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

    Use of notifyDataSetChanged()

    【讨论】:

    • 问题是我需要在适配器的 OnClickListener 中为列表视图的子项定义删除操作。所以在片段的listView ItemOnClickListener中没有设置OnClickListener。我已经修复了该部分,但出现了一个新问题。请看我的编辑。谢谢!
    【解决方案2】:

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

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

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

    现在通知适配器有关 ArrayList 的更改。应该调用哪个Adapter类。

     notifyDataSetChanged();
    

    【讨论】:

    • 问题是我需要在适配器的 OnClickListener 中为列表视图的子项定义删除操作。所以在片段的listView ItemOnClickListener中没有设置OnClickListener。我已经修复了该部分,但出现了一个新问题。请看我的编辑。谢谢!
    • adapter.remove(hashTags.get(position));试试看,可能是hashTag存储了最后一项的引用。
    • 嘿,感谢您的更新。我通过在删除操作后再次设置适配器解决了这个问题。 hashtagListView.setAdapter(adapter); 从另一个问题中得到想法,但仍然不明白为什么 notifyDataSetChanged 不起作用...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-02-05
    • 2020-11-30
    • 1970-01-01
    • 2022-11-01
    • 1970-01-01
    • 2020-05-09
    • 2017-05-27
    相关资源
    最近更新 更多