RecyclerView.Adapter 使用 ContentProvider 的 notifyDataSetChanged()
RecyclerView.Adapter notifyDataSetChanged() using ContentProvider
您好,我正在使用 ContentProvider,在通过单击按钮删除元素后,我的适配器不会通知,如果我返回并再次出现,该元素将被删除。所以 ContentProvider 工作但 notifyDataSetChanged();没有。
public class CategoriesPreferedAdapter extends RecyclerView.Adapter<CategoriesPreferedAdapter.ViewHolder> {
private List<ModelCategoriesProvider> feedItemList;
private Context mContext;
public CategoriesPreferedAdapter(Context context, List<ModelCategoriesProvider> feedItemList) {
this.feedItemList = feedItemList;
this.mContext = context;
}
@Override
public CategoriesPreferedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.categories_prefered_adapter, parent, false);
return new CategoriesPreferedAdapter.ViewHolder(itemView);
}
@Override
public void onBindViewHolder(CategoriesPreferedAdapter.ViewHolder holder, final int position) {
//holder.titleTextView.setText(mList[position]);
final ModelCategoriesProvider feedItem = feedItemList.get(position);
holder.setClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
Toast.makeText(view.getContext(),""+feedItem.getId()+" Users Delete",Toast.LENGTH_LONG).show();
if (isLongClick) {
}
}
});
holder.title.setText(feedItem.getName());
Glide.with(mContext)
.load(Links.ImagePath+feedItem.getImage())
.centerCrop()
// .placeholder(R.drawable.ic_porosiicon)
.crossFade()
.into(holder.categoryImage);
System.out.println("image path "+feedItem.getImage());
holder.delete_category.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//deleteId(feedItem.getId()+"");
String[] whereArgs = {feedItem.getId()+""};
int count = mContext.getContentResolver().delete(UsersProvider.CONTENT_URI,UsersProvider.PID+" =?",whereArgs);
// System.out.println("count erald mjeshtri + mbreti ndaj thuaj princ ndaj thuaj mbret: "+count);
//EventBus.getDefault().post(new Db_Update("update"));
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return (null != feedItemList ? feedItemList.size() : 0);
}
public static class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnLongClickListener{
private TextView title,data,type,amount,billnr;
private ImageView categoryImage,delete_category;
private ItemClickListener clickListener;
CardView card_view;
public ViewHolder(View itemView) {
super(itemView);
card_view = (CardView) itemView.findViewById(R.id.card_view);
title = (TextView) itemView.findViewById(R.id.repoName);
categoryImage = (ImageView) itemView.findViewById(R.id.imageView_category);
delete_category = (ImageView) itemView.findViewById(R.id.imageViewfavourites);
itemView.setTag(itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
public void setClickListener(ItemClickListener itemClickListener) {
this.clickListener = itemClickListener;
}
@Override
public void onClick(View view) {
clickListener.onClick(view, getPosition(), false);
}
@Override
public boolean onLongClick(View view) {
clickListener.onClick(view, getPosition(), true);
return true;
}
}
}
确保您在 content-provider 的删除方法中调用了 notifyChange。它的工作方式是,当附加到任何视图的数据更新时,notifyChange 方法通知该视图有关更新。因此,请确保您已在 CP 的删除方法中调用了 getContext().getContentResolver().notifyChange(uri, null);
。
另一个原因可能是,您不止一次初始化附加到 recyclerview 适配器的 arraylist/list。在这种情况下,列表中的 link 从适配器中丢失,您必须再次 setAdapter
。推荐的方法是在列表中调用 clear
,然后调用 addAll
。
像这样:
list.clear();
list.addAll(your_new_data);
如果有帮助请告诉我。
谢谢!
我遇到了和你一样的问题,我是这样解决的:
在我的中,我有一个数组 "arrayBootable",我用它填充回收视图。
当你想通知你的回收商时,你可以使用你的 ArrayList 名称并调用此方法
public static void notifyRecycler(){
arrayBootable.clear();
arrayBootable.addAll(bootable());
favouriteAdapter.notifyDataSetChanged();
}
尝试在通过处理程序在 UI 线程上发布数据的可运行对象中使用 notifyDataSetChanged()。
在 Utility 方法中定义您的处理程序
private static Handler mainHandler = new Handler(Looper.getMainLooper());
public static void postOnUiThread(Runnable runnable) {
mainHandler.post(runnable);
}
然后在你的代码中:
Utility.postOnUiThread(new Runnable() {
@Override
public void run() {
// call notifyDataSetChanged here
}
});
从 ContentProvider
中删除没问题,但您没有从 AdapterList
中删除,在 notifyDataSetChange
之前,从 ArrayList
中删除,例如
feedItemList.remove(position);
希望对您有所帮助。
您好,我正在使用 ContentProvider,在通过单击按钮删除元素后,我的适配器不会通知,如果我返回并再次出现,该元素将被删除。所以 ContentProvider 工作但 notifyDataSetChanged();没有。
public class CategoriesPreferedAdapter extends RecyclerView.Adapter<CategoriesPreferedAdapter.ViewHolder> {
private List<ModelCategoriesProvider> feedItemList;
private Context mContext;
public CategoriesPreferedAdapter(Context context, List<ModelCategoriesProvider> feedItemList) {
this.feedItemList = feedItemList;
this.mContext = context;
}
@Override
public CategoriesPreferedAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(parent.getContext());
View itemView = inflater.inflate(R.layout.categories_prefered_adapter, parent, false);
return new CategoriesPreferedAdapter.ViewHolder(itemView);
}
@Override
public void onBindViewHolder(CategoriesPreferedAdapter.ViewHolder holder, final int position) {
//holder.titleTextView.setText(mList[position]);
final ModelCategoriesProvider feedItem = feedItemList.get(position);
holder.setClickListener(new ItemClickListener() {
@Override
public void onClick(View view, int position, boolean isLongClick) {
Toast.makeText(view.getContext(),""+feedItem.getId()+" Users Delete",Toast.LENGTH_LONG).show();
if (isLongClick) {
}
}
});
holder.title.setText(feedItem.getName());
Glide.with(mContext)
.load(Links.ImagePath+feedItem.getImage())
.centerCrop()
// .placeholder(R.drawable.ic_porosiicon)
.crossFade()
.into(holder.categoryImage);
System.out.println("image path "+feedItem.getImage());
holder.delete_category.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//deleteId(feedItem.getId()+"");
String[] whereArgs = {feedItem.getId()+""};
int count = mContext.getContentResolver().delete(UsersProvider.CONTENT_URI,UsersProvider.PID+" =?",whereArgs);
// System.out.println("count erald mjeshtri + mbreti ndaj thuaj princ ndaj thuaj mbret: "+count);
//EventBus.getDefault().post(new Db_Update("update"));
notifyDataSetChanged();
}
});
}
@Override
public int getItemCount() {
return (null != feedItemList ? feedItemList.size() : 0);
}
public static class ViewHolder extends RecyclerView.ViewHolder
implements View.OnClickListener, View.OnLongClickListener{
private TextView title,data,type,amount,billnr;
private ImageView categoryImage,delete_category;
private ItemClickListener clickListener;
CardView card_view;
public ViewHolder(View itemView) {
super(itemView);
card_view = (CardView) itemView.findViewById(R.id.card_view);
title = (TextView) itemView.findViewById(R.id.repoName);
categoryImage = (ImageView) itemView.findViewById(R.id.imageView_category);
delete_category = (ImageView) itemView.findViewById(R.id.imageViewfavourites);
itemView.setTag(itemView);
itemView.setOnClickListener(this);
itemView.setOnLongClickListener(this);
}
public void setClickListener(ItemClickListener itemClickListener) {
this.clickListener = itemClickListener;
}
@Override
public void onClick(View view) {
clickListener.onClick(view, getPosition(), false);
}
@Override
public boolean onLongClick(View view) {
clickListener.onClick(view, getPosition(), true);
return true;
}
}
}
确保您在 content-provider 的删除方法中调用了 notifyChange。它的工作方式是,当附加到任何视图的数据更新时,notifyChange 方法通知该视图有关更新。因此,请确保您已在 CP 的删除方法中调用了 getContext().getContentResolver().notifyChange(uri, null);
。
另一个原因可能是,您不止一次初始化附加到 recyclerview 适配器的 arraylist/list。在这种情况下,列表中的 link 从适配器中丢失,您必须再次 setAdapter
。推荐的方法是在列表中调用 clear
,然后调用 addAll
。
像这样:
list.clear();
list.addAll(your_new_data);
如果有帮助请告诉我。 谢谢!
我遇到了和你一样的问题,我是这样解决的: 在我的中,我有一个数组 "arrayBootable",我用它填充回收视图。 当你想通知你的回收商时,你可以使用你的 ArrayList 名称并调用此方法
public static void notifyRecycler(){
arrayBootable.clear();
arrayBootable.addAll(bootable());
favouriteAdapter.notifyDataSetChanged();
}
尝试在通过处理程序在 UI 线程上发布数据的可运行对象中使用 notifyDataSetChanged()。
在 Utility 方法中定义您的处理程序
private static Handler mainHandler = new Handler(Looper.getMainLooper());
public static void postOnUiThread(Runnable runnable) {
mainHandler.post(runnable);
}
然后在你的代码中:
Utility.postOnUiThread(new Runnable() {
@Override
public void run() {
// call notifyDataSetChanged here
}
});
从 ContentProvider
中删除没问题,但您没有从 AdapterList
中删除,在 notifyDataSetChange
之前,从 ArrayList
中删除,例如
feedItemList.remove(position);
希望对您有所帮助。