2016-08-03 6 views
2

RecyclerViewを使用してアイテムのリストを表示するアンドロイドアプリケーションを開発しています。サーバーからjson.Soとしてリストを取得しています。このリスト内に問題があります。私の主なarraylistにタイトルと資料が含まれている場合、その資料は別のarraylistです。あなたは、recyclerview内のリストを表示するソリューションを提案できますか?RecyclerViewの作成中に入れ子にされたArrayList

以下のコードは、以下のコード

public class CurriculumAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

    private Context mContext; 
    private ArrayList<Curriculum> mArrayListCurriculum; 

    public CurriculumAdapter(Context mContext, ArrayList<Curriculum> mArrayListCurriculum) { 
     this.mContext = mContext; 
     this.mArrayListCurriculum = mArrayListCurriculum; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.adapter_key_features, parent,false); 
     return new KeyFeatureViewHolder(v); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 

     if (holder instanceof KeyFeatureViewHolder) { 
      ((KeyFeatureViewHolder) holder).mTextViewFeatureTitle.setText(mArrayListCurriculum.get(position).getTitle()); 
     } 
    } 

    @Override 
    public int getItemCount() { 
     return mArrayListCurriculum == null ? 0 : mArrayListCurriculum.size(); 
    } 

    public static class KeyFeatureViewHolder extends RecyclerView.ViewHolder { 

     public TextView mTextViewFeatureTitle; 

     public KeyFeatureViewHolder(View itemView) { 
      super(itemView); 
      mTextViewFeatureTitle = (TextView) itemView.findViewById(R.id.txtFeature); 
     } 
    } 
} 

私のアダプタであるホルダ内bind方法がそれにデータを渡すための良い方法である

public class CourseCurriculumFragment extends Fragment { 

    private FragmentInterface mFragmentInterface; 
    private ArrayList<Curriculum> mArrayListCurriculum; 
    private ArrayList<Material> mArrayListMaterial; 
    private RecyclerView mRecyclerViewCurriculum; 
    private LinearLayoutManager mLinearLayoutManager; 
    private CurriculumAdapter mCurriculumAdapter; 

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

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     initView(view); 
    } 

    private void initView(View view) { 
     mArrayListMaterial = new ArrayList<>(); 
     mArrayListCurriculum = new ArrayList<>(); 
     populateMaterials(); 
     populateKeyFeatures(); 

     mRecyclerViewCurriculum = (RecyclerView) view.findViewById(R.id.recyclerViewCurriculum); 
     mCurriculumAdapter = new CurriculumAdapter(getActivity(), mArrayListCurriculum); 
     mLinearLayoutManager = new LinearLayoutManager(getActivity()); 
     mRecyclerViewCurriculum.setLayoutManager(mLinearLayoutManager); 
     mRecyclerViewCurriculum.setAdapter(mCurriculumAdapter); 
     mRecyclerViewCurriculum.setItemAnimator(new DefaultItemAnimator()); 
    } 

    private void populateMaterials() { 
     mArrayListMaterial.add(new Material("12:00","pdf","","Sample Text","0")); 
     mArrayListMaterial.add(new Material("12:00","pdf","","Sample Text","0")); 
    } 

    private void populateKeyFeatures() { 
     mArrayListCurriculum.add(new Curriculum("UNIT 1",mArrayListMaterial)); 
     mArrayListCurriculum.add(new Curriculum("UNIT 2",mArrayListMaterial)); 
     mArrayListCurriculum.add(new Curriculum("UNIT 3",mArrayListMaterial)); 
    } 
} 
+0

こんにちはGuysは、私はrecyclerviewを使用していたし、そのrecyclerviewのアダプタの内側に私は別のものを追加しました材料のArraylistを表示するためにrecyclewrview。 –

答えて

1

ダミーArrayListのデータと私の断片です。

この場合、bindメソッドは、CurriculumオブジェクトとMaterialオブジェクトをパラメータとして使用する必要があります。

アダプターのメソッド内では、ホルダーの変数に達する代わりに、このbindメソッドを呼び出す必要があります。

KeyFeatureViewHolderクラス内のメソッドの実装では、これらの渡されたパラメータを使用して適切なUI要素に表示する必要があります。

最後に、Materialのオブジェクトデータをアダプタに取得するには、をコンストラクタパラメータとしてCurriculumと同じように追加します。

+0

返信ありがとう –

1

ヘッダーにはRecyclerView、ヘッダーにはtitle、ヘッダーにはmaterialsを使用してください。 this exampleを見てください。

+0

返信ありがとう –

1

自分でカスタムリストを設計する必要があります。たとえば、このようなオブジェクトを取る。

public class ListItem { 
    public curriculumName = null; 
    public materialName = null; 
} 

JSON文字列を解析した後に、このリストに値を設定します。今すぐあなたの最初のCurriculumを取得し、この

private ArrayList<ListItem> mListItemArray = new ArrayList<ListItem>(); 

for(curriculum : mArrayListCurriculum) { 

    ListItem mListItemHead = new ListItem();  
    mListItemHead.curriculumName = curriculum.getName(); 

    // Set the header here 
    mListItemArray.add(mListItemHead); 

    for(material : curriculum.getMaterials()){ 
     ListItem mListItem = new ListItem(); 
     mListItem.materialName = material.getName(); 

     // Add materials here 
     mListItemArray.add(mListItem); 
    } 
} 

のようなオブジェクトを取り込むには、ヘッダと物質とのリストをしました。 mListItemArraymaterialNameがヌルの場合、これはヘッダーであることを示し、逆も同様です。

ここで、あなたのRecyclerViewのアダプタを変更して、リスト内のアイテムに適切なビューをバインドすることができます。

this answerから、この望ましい動作を実現する方法がわかります。

基本的には、getItemViewTypeを変更して、onBindViewHolderに適切な表示を渡すようにしてください。 getItemViewTypeはこのように見えます。私がやっていることreply.Butのおかげで、私はthis.Thatを達成するために、ネストされたリサイクルビューの概念を使用していたある

@Override 
public int getItemViewType(int position) { 
    if (mListItemArray.get(position).curriculumName != null) { 
     // This is where we'll add header. 
     return HEADER_VIEW; 
    } 

    return super.getItemViewType(position); 
} 
+0

返信ありがとう –

関連する問題