Обновлять представление списка при удалении элемента

У меня есть ListView, который показывает мне некоторые данные через массив (добавление и удаление)

Всякий раз, когда я удаляю элемент из ListView через контекстное меню, список не обновляется, но элемент удаляется из массива. Как я могу обновить список, чтобы показать, что элемент удален в данный момент?

Код

public class FavouritesLisViewAdapter extends ArrayAdapter<NewsModel> {



    public FavouritesLisViewAdapter(Context context, List<NewsModel> newsModel){
        super(context, R.layout.home_fragment,newsModel);

    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {

        LayoutInflater layoutInflater = LayoutInflater.from(getContext());
        View view = layoutInflater.inflate(R.layout.favourites_custom_row,parent,false);

        final NewsModel singleNews = getItem(position);
        TextView title = (TextView) view.findViewById(R.id.textViewFav);
        ImageView image = (ImageView) view.findViewById(R.id.idFavmage);
        ImageView filledHeart = (ImageView)view.findViewById(R.id.favImage);
        final ListView favListView = (ListView)view.findViewById(R.id.favouriteLV) ;

        filledHeart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //implementation to change status back to 1(negative)
                DBHelper db=new DBHelper(getContext());
                String id=singleNews.getId();
                db.reverseUpdateFavourites(id);
                Toast.makeText(getContext(),"Item removed from favourites",Toast.LENGTH_SHORT).show();
                notifyDataSetChanged();

            }
        });


        title.setText(singleNews.getTitle());
        Picasso.get().load(singleNews.getUrlToImage()).into(image);

        return view;
    }
}

Вы удаляете элемент из массива, который вы использовали для установки адаптера?

sanjeev 15.05.2019 07:24

да. Я удаляю элемент, щелкнув значок удаления. Хотя элемент удаляется, список не обновляется в данный момент. @sanjeev

Ruks 15.05.2019 07:30

«Всякий раз, когда я удаляю элемент из ListView через контекстное меню» — где это контекстное меню? Как вы справляетесь с удалением там?

Mike M. 15.05.2019 07:40
ListView — это устаревший компонент. Вы должны использовать RecyclerViewdeveloper.android.com/guide/topics/ui/layout/recyclerview
Scrobot 15.05.2019 08:14

В моем приложении есть 2 фрагмента, которые называются «Фрагмент дома» и «Фрагмент списка желаний». Я добавляю новости в адаптер списка желаний, щелкая значок, отображая всплывающее сообщение. И проблема, которая у меня есть во фрагменте списка желаний, заключается в удалении добавленных элементов. Во фрагменте списка желаний, когда я щелкнул значок удаления в соответствующем элементе или элементах, он отображает всплывающие сообщения. Это означает, что элемент удаляется из базы данных. Проблема, с которой я столкнулся, заключается в том, чтобы показать эти изменения во фрагменте списка желаний без ручного обновления фрагмента. После того, как я обновился сам, я вижу там изменения. @Майк М.

Ruks 15.05.2019 08:27

Хорошо, но где контекстное меню, о котором вы упомянули?

Mike M. 15.05.2019 08:30
2
6
1 023
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Попробуйте этот код.

Расширьте свой ListAdapter до BaseAdapter и передайте список этому адаптеру.

    private class ListAdapter extends BaseAdapter {
        final Context context;
        List<NewsModel> newsModelList = new ArrayList();
        View view;
        LayoutInflater layoutInflater;

        private ListAdapter(Context context, List<NewsModel> newsModel) {
            this.context = context;
            this.newsModelList = newsModel;
        }

        @Override
        public int getCount() {
            return newsModelList.size();
        }

        @Override
        public Object getItem(int i) {
            return null;
        }

        @Override
        public long getItemId(int i) {
            return 0;
        }

        @Override
        public View getView(int i, View convertView, ViewGroup viewGroup) {
            layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View view = layoutInflater.inflate(R.layout.favourites_custom_row,parent,false);

        final NewsModel singleNews = getItem(position);
        TextView title = (TextView) view.findViewById(R.id.textViewFav);
        ImageView image = (ImageView) view.findViewById(R.id.idFavmage);
        ImageView filledHeart = (ImageView)view.findViewById(R.id.favImage);
        final ListView favListView = (ListView)view.findViewById(R.id.favouriteLV) ;

        filledHeart.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                //implementation to change status back to 1(negative)
                DBHelper db=new DBHelper(getContext());
                String id=singleNews.getId();
                db.reverseUpdateFavourites(id);
              ///// ADD THIS LINE  ///////
                newsModelList.remove(Integer.valueOf(id));
                Toast.makeText(getContext(),"Item removed from favourites",Toast.LENGTH_SHORT).show();
                notifyDataSetChanged();

            }
        });


        title.setText(singleNews.getTitle());
        Picasso.get().load(singleNews.getUrlToImage()).into(image);

        return view;
    }
}

Вы удаляете данные из базы данных, я думаю, что вы не обновляете список данных, которые вы передаете в адаптер, попробуйте перезагрузить адаптер с обновленным списком данных.

Используйте следующий метод, чтобы уведомить адаптер об удалении одного элемента.

notifyItemRemoved(position);

Используйте следующий метод, чтобы уведомить адаптер об удалении диапазона (удалено несколько элементов в последовательности).

notifyItemRangeRemoved(position, count);

Вызовите notifyDataSetChanged() для вашего объекта адаптера. Или используйте Recyclerview. В RecyclerView.Adapter доступны различные методы для обновления пользовательского интерфейса списка. Например, notifyItemRemoved (int position), notifyItemRangeRemoved (int, int), notifyItemChanged (int) и т. д. Выберите тот, который соответствует вашим требованиям.

Я вызвал notifyDataSetChanged(). Не могли бы вы помочь мне правильно разместить метод в объекте. @user320676

Ruks 15.05.2019 08:39

Чтобы помочь вам в дальнейшем, мне нужно увидеть код вашей активности/фрагмента.

user320676 15.05.2019 10:28

Если вы хотите удалить элемент из представления повторного использования, лучше всего удалить объект из списка в ViewModel/Presenter, а затем обновить список в адаптере, чтобы обновить пользовательский интерфейс списка.

Другие вопросы по теме