【问题标题】:refresh fragment when i delete an item from listview?当我从列表视图中删除项目时刷新片段?
【发布时间】:2018-11-21 20:20:16
【问题描述】:

当我从我的 recyvlerview 中删除一个项目时,它会正确反映在我的视图中,但我也需要在与我的 recyvlerview 相关的文本视图中反映它。

有没有办法通过从我的适配器的recyvlerview中删除一个项目来重新加载片段?

holder.layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("Remove");
            builder.setTitle("Do you want to remove");
            builder.setNeutralButton("Remove", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int witch) {
                    DatabaseHelper dbHelper = new DatabaseHelper(context);
                    dbHelper.deleteItem(cot.getId(), context);
                    list.remove(position);
                    recyclerView.removeViewAt(position);
                    notifyItemRemoved(position);
                    notifyItemRangeChanged(position,list.size());
                    notifyDataSetChanged();
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int witch ) {
                    dialog.dismiss();
                }
            });

            builder.create().show();
        }
    });

更新:

也许我没有很好地解释自己,这就是答案不起作用的原因。当我从我的 recyclerview 删除项目正确刷新时,我从我的适配器调用我的项目并将其放入 textviews。我使用这些 texviews 中的数据进行求和、减法等,并将结果放在另一个 textviews 中,但如果我删除一个项目,这些数据不会改变,因为它们不是我的 recyclerview 的一部分。但是,如果我再次打开我的片段,我可以在我的文本视图中看到不同的结果,所以我认为每当我删除我的 recyclerview 的一个项目时,我真的需要刷新整个片段

【问题讨论】:

  • 当recycler view内容发生变化时,通过接口通知fragment改变其内容。
  • 你能帮我提供接口代码吗?请

标签: android android-recyclerview fragment refresh


【解决方案1】:

是的,有很多方法可以解决这个问题... 您可以通过以下方式创建它, 首先,

  1. 如果您通过 XML 创建片段, 所以你只需要先通过like来获取你的片段

    FragmentClassName object=getSupportFragmentManager().findFragmentById(R.id.id_frag);
    
  2. 如果您以编程方式按视图组添加片段

    FragmentClassName object=getSupportFragmentManager().beginTransaction().add().commit();
    

使用该对象调用 Fragment 类中的任何方法来更新视图或数据

喜欢这里,

holder.layout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {
            AlertDialog.Builder builder = new AlertDialog.Builder(context);
            builder.setTitle("Remove");
            builder.setTitle("Do you want to remove");
            builder.setNeutralButton("Remove", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialogInterface, int witch) {
                    DatabaseHelper dbHelper = new DatabaseHelper(context);
                    dbHelper.deleteItem(cot.getId(), context);
                    list.remove(position);
                    recyclerView.removeViewAt(position);
                    notifyItemRemoved(position);

                    object.methodCall();

                    // Don't do that only one call is enough to delete item from view
                    // notifyItemRangeChanged(position,list.size());
                    //notifyDataSetChanged();
                }
            });
            builder.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
                @Override
                public void onClick(DialogInterface dialog, int witch ) {
                    dialog.dismiss();
                }
            });
            builder.create().show();
        }
    });

还有一些棘手的方法,使用接口调用调用机制,

如果你知道它们,那么你可以通过调用静态方法来绑定接口,并使用他的对象进行调用。

让我通过调用接口机制更新我的答案以获得更多帮助

     //write this on your activity or fragment to get delete notification
    // Can be used to get reply on Any Class Either Activity or Fragment, no matter you recycler or adapter existence class.
    Adapter.bindListener(new Adapter.NotifyMe() {
        @Override
        public void onItemDelete() {
         // When ever your delete code run your this block run then you can
       //Update your code from here if you want to update things of fragment class
        }
    });

你的适配器类

    Class Adapter extend RecyclerView.Adapter<Adapter.ViewHolder> {
        private static NotifyMe notifyMe;

        public static void bindListener (NotifyMe notifyMeListener){
            notifyMe = notifyMeListener;
        }

        @Override
        public void onBindViewHolder (@NonNull ViewHolder viewHolder,int position){
            holder.layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    builder.setNeutralButton("Remove", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int witch) {
                            //....
                            notifyItemRemoved(position);

                           //  object.methodCall();
                            //Call this here this will take you to implementation block.
                            if (notifyMe != null)
                                notifyMe.onItemDelete();
                            // Don't do that only one call is enough to delete item from view
                            // notifyItemRangeChanged(position,list.size());
                            //notifyDataSetChanged();
                        }
                    });
                }
            });
        }
        public interface NotifyMe {
            void onItemDelete();
        }
    }

或者还有其他的实现只是为了你的学习

//你的适配器对象声明代码

    Adapter adapter = new Adapter(new Adapter.NotifyMe() {
        @Override
        public void onItemDelete() {
            // When ever your delete code run your this block run then you can
            //Update your code from here if you want to update things of fragment class
        }
    });

适配器类代码:

    Class Adapter extend RecyclerView.Adapter<Adapter.ViewHolder> {
        private NotifyMe notifyMe;
        public Adapter(NotifyMe notifyMe) {
          this.notifyMe=notifyMe;
        }

        @Override
        public void onBindViewHolder (@NonNull ViewHolder viewHolder,int position){
            holder.layout.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    builder.setNeutralButton("Remove", new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialogInterface, int witch) {
                            //....
                            notifyItemRemoved(position);

                            // object.methodCall();
                            //Call this here this will take you to implementation block.
                            notifyMe.onItemDelete();
                            // Don't do that only one call is enough to delete item from view
                            // notifyItemRangeChanged(position,list.size());
                            //notifyDataSetChanged();
                        }
                    });
                }
            });
        }


        public interface NotifyMe {
            void onItemDelete();
        }
    }

【讨论】:

  • 我在哪里添加 FragmentClassName object=getSupportFragmentManager().beginTransaction().add().commit(); ?在 onCreateView 中?
  • 对不起,我没接你。请参阅无需为更新调用重新创建片段。如果我没记错的话,你有 Activity 类(带有 Recycler View + Adapter)和另一个类 Fragment。对吗?
  • 或者你有带有适配器+TextView的RecyclerView存在的片段?
  • 我只是在更新我的代码,如果这对你有帮助,请告诉我。
  • 没错,但也许我没有很好地解释自己,这就是为什么不起作用。当我从我的 recyclerview 删除项目正确刷新时,我从我的适配器调用我的项目并将其放入 textviews。我使用这些 texviews 中的数据进行求和、减法等,并将结果放在另一个 textviews 中,但如果我删除一个项目,这些数据不会改变,因为它们不是我的 recyclerview 的一部分。但是,如果我再次打开我的片段,我可以在我的文本视图中看到不同的结果,所以我认为每当我删除我的 recyclerview 的一个项目时,我真的需要刷新整个片段
【解决方案2】:

我不确定,但我想解决这个问题。将以下代码放在删除按钮中:-

FragmentTransaction ft = getSupportFragmentManager().beginTransaction();
ft.detach(this).attach(this).commit();

因此,每当删除项目时,都会触发此代码以刷新您的片段。

【讨论】:

  • 我无法调用 getFragmentManager。我也得到了“android.support.v4.app.Fragment 中的分离不能应用于 DialogInterface.OnClickListener
  • @androiddevjs 你好,你能不能再检查一下代码。让我知道结果如何。
  • 还是不行!我无法调用 getSupportFragmentManager 和 ft.detach(this)。如果它有助于我的适配器从 RecyclerView.Adapter
猜你喜欢
  • 2021-01-06
  • 1970-01-01
  • 1970-01-01
  • 2013-10-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多