0

一部のアイテムをフラグメント内のrecycleViewに表示しようとしています。アイテムは別のフラグメントから来ます。最初に空のarrayListを使用してrecycleViewを作成しますが、ボタンを押すと、データがインターフェイス経由で送信され、メソッドによってArrayListが生成されます。私は一日中これをデバッグし、完璧に働いています。ボタンを押すと、ArrayListのサイズが1になったことが記録されます。アダプタが更新されません

リストが変更されたときにアダプタに通知する必要があることを読んでいたので、notifyDataSetChange()、notifyItemInserted(dataReceived.size()-1)を使用しようとしましたが、どちらもうまくいかないようです。

public class FavoriteFragment extends Fragment { 
private OnFragmentInteractionListener mListener; 

RecyclerView myRecyclerView; 
public ArrayList<RecycleViewItem> dataReceived; 


public MyFavoriteAdapter adapter; 
public FavoriteFragment() { 

} 

public void setDataReceived(ArrayList<RecycleViewItem> dataReceived){ 
    this.dataReceived = dataReceived; 
    Log.d("INTERFACE", "Data received by the FavoriteFragment!!!!" + " " + this.dataReceived.get(0).getCardName()); 
    for(int i = 0; i < dataReceived.size(); i++) { 
     //THIS LINE RETURNS A 1 
     Log.d("INTERFACE", "Items inside the dataReceived: " + dataReceived.size()); 
     //NEITHER WORKED 
     //adapter.notifyItemInserted(dataReceived.size() -1); 
     //adapter.notifyDataSetChanged(); 
     //THIS LINE WILL KEEP ON RETURNING 0 
     Log.d("INTERFACE", "Items inside the list inside the adapter: " + adapter.getItemCount()); 
    } 
} 

public static FavoriteFragment newInstance() { 
    FavoriteFragment fragment = new FavoriteFragment(); 
    return fragment; 
} 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 

} 



@Override 
public void onActivityCreated(@Nullable Bundle savedInstanceState) { 
    super.onActivityCreated(savedInstanceState); 
    dataReceived = new ArrayList<>(); 
    adapter = new MyFavoriteAdapter(dataReceived); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, 
         Bundle savedInstanceState) { 
    View view = inflater.inflate(R.layout.fragment_favorite, container, false); 

    myRecyclerView = (RecyclerView) view.findViewById(R.id.recycleView); 
    myRecyclerView.setHasFixedSize(true); 
    LinearLayoutManager myLayoutManager = new LinearLayoutManager(getActivity()); 
    myLayoutManager.setOrientation(LinearLayoutManager.VERTICAL); 
    if (myRecyclerView != null) { 
     myRecyclerView.setAdapter(adapter); 
    } 
    myRecyclerView.setLayoutManager(myLayoutManager); 
    return view; 
} 

public void onButtonPressed(Uri uri) { 
    if (mListener != null) { 
     mListener.onFragmentInteraction(uri); 
    } 
} 

@Override 
public void onAttach(Context context) { 
    super.onAttach(context); 
    if (context instanceof OnFragmentInteractionListener) { 
     mListener = (OnFragmentInteractionListener) context; 
    } else { 
     throw new RuntimeException(context.toString() 
       + " must implement OnFragmentInteractionListener"); 
    } 
} 

@Override 
public void onDetach() { 
    super.onDetach(); 
    mListener = null; 
} 

public interface OnFragmentInteractionListener { 
    void onFragmentInteraction(Uri uri); 
} 
} 

これはアダプタです::

私はadapter.getItemCount()をチェックしたときに、それはここでデータを受信するフラグメント内の私のコードです。1.

をスローArrayListのは言うものの、私に0をスローします

public class MyFavoriteAdapter extends RecyclerView.Adapter<MyViewHolder>{ 
private ArrayList<RecycleViewItem> list = new ArrayList<RecycleViewItem>(); 

InterfaceListItemClickListener sender = null; 


public MyFavoriteAdapter(ArrayList<RecycleViewItem> list) { 
    this.list = list; 
} 

@Override 
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // create a new view 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycle_item_favorite, parent, false); 
    MyViewHolder holder = new MyViewHolder(view, sender); 
    return holder; 
} 

@Override 
public void onBindViewHolder(MyViewHolder holder, int position) { 
    if(list.size() >= 1) { 
     holder.favoriteImageView.setImageResource(list.get(position).getImageResourceID()); 
     holder.favoriteTextView.setText(list.get(position).getCardName()); 
    } 
} 

@Override 
public int getItemCount() { 
    return list.size(); 
} 
} 

答えて

2

を再作成しないでください。ここで

は、あなたの方法である:あなたのフラグメントのthis.dataReceivedにパラメータdataReceivedの割り当て

public void setDataReceived(ArrayList<RecycleViewItem> dataReceived){ 
    this.dataReceived = dataReceived; 
    ... 
} 

は、あなたのアダプタのlistどのような方法では影響を受けません。

public void setDataReceived(ArrayList<RecycleViewItem> dataReceived){ 
    adapter.list.addAll(dataReceived); 
    ... 
} 

あなたのアダプタのlist変数公共をしなければならない、またはゲッターを経由して、それを公開することがあります。:

public ArrayList<RecycleViewItem> getList() { 
    return list 
} 

あるいは追加できるメソッドを追加むしろ、あなたの代わりにこのような何かを行うことができますアイテム:

public void addAll(ArrayList<RecycleViewItem> items) { 
    list.addAll(items); 
} 
+0

これは感謝しました!私はそれらのメソッドを実際に知らなかった。アプリはまだ私が欲しいものをやっていないが、少なくともこれは修正されました!私はあなたの答えを受け入れてくれます –

0

public void setDataReceived(ArrayList dataReceived){ this.dataReceived.addAll(dataReceived); .... } あなたのアダプタはプライベート変数listを持っており、これはどんな効果があるとadapter.notifyDataSetChanged()用に変更する必要があり、リストに

関連する問題