У меня есть 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
«Всякий раз, когда я удаляю элемент из ListView через контекстное меню» — где это контекстное меню? Как вы справляетесь с удалением там?
ListView — это устаревший компонент. Вы должны использовать RecyclerViewdeveloper.android.com/guide/topics/ui/layout/recyclerviewВ моем приложении есть 2 фрагмента, которые называются «Фрагмент дома» и «Фрагмент списка желаний». Я добавляю новости в адаптер списка желаний, щелкая значок, отображая всплывающее сообщение. И проблема, которая у меня есть во фрагменте списка желаний, заключается в удалении добавленных элементов. Во фрагменте списка желаний, когда я щелкнул значок удаления в соответствующем элементе или элементах, он отображает всплывающие сообщения. Это означает, что элемент удаляется из базы данных. Проблема, с которой я столкнулся, заключается в том, чтобы показать эти изменения во фрагменте списка желаний без ручного обновления фрагмента. После того, как я обновился сам, я вижу там изменения. @Майк М.
Хорошо, но где контекстное меню, о котором вы упомянули?
Попробуйте этот код.
Расширьте свой 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
Чтобы помочь вам в дальнейшем, мне нужно увидеть код вашей активности/фрагмента.
Если вы хотите удалить элемент из представления повторного использования, лучше всего удалить объект из списка в ViewModel/Presenter, а затем обновить список в адаптере, чтобы обновить пользовательский интерфейс списка.
Вы удаляете элемент из массива, который вы использовали для установки адаптера?