0

你好,我正在使用ContentProvider,并通过单击按钮删除元素后,我的适配器不通知,如果我回去再次来元素被删除。所以ContentProvider的作品,但notifyDataSetChanged();没有。RecyclerView.Adapter使用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; 
    } 
} 

}

+0

请提供完整的代码。也许你正在使用适配器中的不同列表。 – vijaypalod

+0

我在适配器中提供了完整的代码 –

+0

尝试像这样更新您的onClick方法。 'holder.delete_category.setOnClickListener(新View.OnClickListener(){ @Override 公共无效的onClick(查看视图){ //deleteId(feedItem.getId()+ “”); 字符串[] whereArgs = { feedItem.getId()+ “”}; 诠释计数= mContext.getContentResolver()删除(UsersProvider.CONTENT_URI,UsersProvider.PID +。 “=”,whereArgs?); feedItemList.remove(位置) notifyDataSetChanged(); } });' – vijaypalod

回答

1

ContentProvider删除是好的,但你没有从AdapterList删除,notifyDataSetChange之前,删除ArrayList like

feedItemList.remove(position);

希望它有帮助。

0

确保你在你的内容提供商的删除方法调用有NotifyChange。它的工作方式是,更新附加到任何视图的数据时,notifyChange方法会通知该视图关于更新。因此,请确保您在CP中的删除方法内部调用了getContext().getContentResolver().notifyChange(uri, null);

另一个原因可能是,您正在不止一次地初始化连接到recyclerview适配器的ArrayList /列表。在这种情况下,到适配器的链接将丢失,并且您必须再次登录setAdapter。推荐的方法是在名单上拨打clear,然后拨打addAll。 是这样的:

list.clear(); 
list.addAll(your_new_data); 

让我知道它是否有帮助。 谢谢!

+0

是第二个答案id的主要想法,我忘了声明feedItemList.remove(position);谢谢你的时间 –

1

我有同样的问题,像你的问题,我用这种方式解决了这个问题: 在我的,我有一个数组“arrayBootable”,我用它填充循环视图。 您可以使用ArrayList的名称和调用此方法时,要通知你的回收

public static void notifyRecycler(){ 
    arrayBootable.clear(); 
    arrayBootable.addAll(bootable()); 
    favouriteAdapter.notifyDataSetChanged(); 
} 
0

尝试使用notifyDataSetChanged()内的可运行的,通过处理程序的UI线程数据发布。

定义你的处理器的实用方法

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 
      } 
     });