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()+ ""); のString [] whereArgs = { feedItem.getId()+ ""}; INTカウント= mContext.getContentResolver()を削除(UsersProvider.CONTENT_URI、UsersProvider.PID +する。 "="、whereArgs?); feedItemList.remove(位置) notifyDataSetChanged(); } }); – vijaypalod

答えて

1

は結構ですが、あなたはから削除、notifyDataSetChange前に、AdapterListから削除しませんでした:

あなたのコード内で

private static Handler mainHandler = new Handler(Looper.getMainLooper()); 

public static void postOnUiThread(Runnable runnable) { 
     mainHandler.post(runnable); 
    } 

その後のユーティリティメソッドであなたのハンドラを定義します。 ArrayListのようなもの

希望します。

0

あなたは、コンテンツ・プロバイダの削除方法でnotifyChangeを呼び出していることを確認してください。どのようなビューにも添付されたデータが更新されると、notifyChangeメソッドはそのビューに更新について通知します。だから、CPのdeleteメソッドの中にgetContext().getContentResolver().notifyChange(uri, null);と呼んでいることを確認してください。

もう1つの理由は、recyclerviewアダプタに接続されたarraylist/listを複数回初期化している可能性があります。その場合、リストへのリンクはアダプタから失われ、再度setAdapterにする必要があります。お勧めの方法は、clearに続いてaddAllを呼び出すことです。 は次のとおりです。

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

助けてくれたら教えてください。 ありがとう!

+0

はい2番目の答えIDの主なアイデア、私はfeedItemList.remove(位置)を宣言するのを忘れてしまった;あなたのお時間をありがとう –

1

私はあなたの問題のような同じ問題を抱えていました。この問題をこのように解決しました: 私の場合、私はリサイクルされたビューを書き込む配列 "arrayBootable"を持っています。 あなたのArrayListの名を使用して、

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

がハンドラを介してUIスレッド上で実行可能なことの記事データ内notifyDataSetChangedを()使用してみてください、あなたの回収業者に通知したいときに、このメソッドを呼び出すことができます。 ContentProviderから削除

Utility.postOnUiThread(new Runnable() { 
      @Override 
      public void run() { 
       // call notifyDataSetChanged here 
      } 
     }); 
関連する問題