обновить фрагмент при удалении элемента из списка? - PullRequest
0 голосов
/ 21 ноября 2018

Когда я удаляю элемент из моего 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();
        }
    });

ОБНОВЛЕНИЕ:

Может быть, я не очень хорошо объяснил себя, и поэтому ответы не работают.Когда я удаляю из своего рециркулятора предметы, обновляю правильно, я вызываю свой предмет из моего адаптера и помещаю его в текстовые просмотры.Я использую данные из этих текстовых представлений для суммирования, вычитания и т. Д. И помещаю их результат в другие текстовые просмотры, но эти не меняются, если я удаляю элемент, потому что они не являются частью моего повторного просмотра.Но если я снова открою свой фрагмент, я смогу увидеть другой результат в моих текстовых представлениях, поэтому я думаю, что мне действительно нужно обновлять весь фрагмент всякий раз, когда я удаляю элемент моего recylcerview

Ответы [ 2 ]

0 голосов
/ 21 ноября 2018

Да, есть много способов справиться с этим ... Вы можете создать это, во-первых,

  1. Если вы создаете свой фрагмент с помощью XML, то вам просто нужно получитьваш фрагмент сначала похож на

    FragmentClassName object=getSupportFragmentManager().findFragmentById(R.id.id_frag);
    
  2. Если вы добавляете фрагмент по группам представления программно

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

Используйте этот объект для вызова любого методаиз класса фрагмента для обновления представления или данных

Как здесь,

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();
        }
    }
0 голосов
/ 21 ноября 2018

Я не уверен в этом, но я хочу заняться этим вопросом.Поместите следующий код в кнопку удаления: -

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

Поэтому при каждом удалении элемента этот код будет запускаться для обновления вашего фрагмента.

...