【问题标题】:Nested ArrayList while creating RecyclerView创建 RecyclerView 时嵌套 ArrayList
【发布时间】:2016-12-09 01:00:21
【问题描述】:

我正在开发一个 android 应用程序,我在其中使用 RecyclerView 显示项目列表。我从服务器获取列表作为 json。所以我的问题是在这个列表中我得到另一个列表作为项目。那就是如果我的主要数组列表包含标题和材料,材料是另一个数组列表。所以你能建议一个解决方案来在 recyclerview 中显示一个列表。

下面的代码是我的适配器

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

下面的代码是我的带有虚拟数组列表数据的片段

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

【问题讨论】:

  • 嗨,伙计们,感谢您的回复。但是我所做的是我使用了嵌套的回收器视图概念来实现这一点。也就是说,我使用了一个回收器视图,并且在该回收器视图的适配器内部我有添加了另一个 recyclewrview 来显示 Material Arraylist。

标签: android android-recyclerview


【解决方案1】:

持有者中的bind 方法是向其传递数据的好方法。

在您的情况下,此bind 方法应接受CurriculumMaterial 对象作为参数。

在适配器的onBindViewHolder 方法中,您应该调用此bind 方法,而不是进入持有者的变量。

KeyFeatureViewHolder 类中的方法的实现中,您应该使用这些传递的参数并将它们显示在适当的 UI 元素中。

最后,要将Material 对象数据放入适配器,添加ArrayList&lt;Material&gt; 作为构造函数参数,就像使用Curriculum 一样。

【讨论】:

  • 感谢回复
【解决方案2】:

RecyclerView 与标题一起使用,title 作为标题,materials 作为该标题的项目。看this example

【讨论】:

  • 感谢回复
【解决方案3】:

您需要为自己设计一个自定义列表。例如采取这样的对象。

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

现在,您有了一个包含标题和材料的列表。当mListItemArray 中的materialName 为空时,它表明这是一个标头,反之亦然。

现在的诀窍是修改RecyclerView 的适配器,以便您可以将正确的视图绑定到列表中的项目。

您可以从this answer 中找到有关如何实现此所需行为的指示。

基本上,这个想法是修改您的getItemViewType 以在您的onBindViewHolder 中传递正确的视图。您的 getItemViewType 可能看起来像这样。

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

【讨论】:

  • 感谢回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多