首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >RecyclerView中的RecyclerVIew

RecyclerView中的RecyclerVIew
EN

Stack Overflow用户
提问于 2016-01-02 16:25:34
回答 1查看 1.1K关注 0票数 0

我想创建嵌套的RecyclerViews,但问题是只显示了父对象。

父适配器

代码语言:javascript
复制
public class SectionsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    Context mContext;
    List<Section> mSections;

    public SectionsAdapter(Context context, List<Section> sections) {
        mContext = context;
        mSections = sections;
    }

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

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int pos) {
        Section section = mSections.get(pos);
        if (holder instanceof SectionViewHolder) {
            SectionViewHolder sectionVH = (SectionViewHolder) holder;
            sectionVH.mTitle.setText(section.getTitle());
            LinearLayoutManager manager = new LinearLayoutManager(mContext);
            sectionVH.mPreferences.setLayoutManager(manager);
            PreferencesAdapter preferencesAdapter = new PreferencesAdapter(mContext, section.getPreferences());
            sectionVH.mPreferences.setAdapter(preferencesAdapter);
            sectionVH.mPreferences.getAdapter().notifyDataSetChanged();
        }
    }

    @Override
    public int getItemViewType(int pos) {
        return 0;
    }

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

子适配器

代码语言:javascript
复制
public class PreferencesAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public static final int VIEW_BOOLEAN = 0;
    public static final int VIEW_INT = 1;

    Context mContext;
    List<Preference> mPreferences;

    public PreferencesAdapter(Context context, List<Preference> preferences) {
        mContext = context;
        mPreferences = preferences;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view;
        switch (viewType) {
            default:
                view = LayoutInflater.from(parent.getContext()).inflate(R.layout.view_preference_boolean, parent, false);
                return new BooleanPreferenceViewHolder(view);
        }
    }

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int pos) {
        Preference preference = mPreferences.get(pos);
        if (holder instanceof BooleanPreferenceViewHolder) {
            BooleanPreferenceViewHolder booleanPreferenceVH = (BooleanPreferenceViewHolder) holder;
            booleanPreferenceVH.mPreferenceTitle.setText(preference.getTitle());
            booleanPreferenceVH.mPreferenceExplanation.setText(preference.getExplanation());
            booleanPreferenceVH.mBooleanSwitch.setChecked((Boolean) preference.getValue());
        }
    }

    @Override
    public int getItemViewType(int pos) {
        return VIEW_BOOLEAN;
    }

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

父视图框

代码语言:javascript
复制
public class SectionViewHolder extends RecyclerView.ViewHolder {

    public TextView mTitle;
    public RecyclerView mPreferences;

    public SectionViewHolder(View v) {
        super(v);
        mTitle = (TextView) v.findViewById(R.id.sectionTitle);
        mPreferences = (RecyclerView) v.findViewById(R.id.preferences);
    }

}

子视图框

代码语言:javascript
复制
public class BooleanPreferenceViewHolder extends RecyclerView.ViewHolder {

    public TextView mPreferenceTitle;
    public TextView mPreferenceExplanation;
    public Switch mBooleanSwitch;

    public BooleanPreferenceViewHolder(View v) {
        super(v);
        mPreferenceTitle = (TextView) v.findViewById(R.id.preferenceTitle);
        mBooleanSwitch = (Switch) v.findViewById(R.id.booleanSwitch);
        mPreferenceExplanation = (TextView) v.findViewById(R.id.preferenceExplanation);
    }

}

所以我注意到它只显示了父级标题,它的回收器视图是空的。子onBindViewHolder方法也未调用。

EN

回答 1

Stack Overflow用户

发布于 2016-04-23 22:20:04

您只需使用一个RecyclerView,适当地覆盖getItemViewType方法,就可以实现您想要的结果。您可以看到一个示例here

下面是将SectionPreferenceBooleanPreferenceViewHolder类与库SectionedRecyclerViewAdapter一起使用的示例。

首先创建一个section类:

代码语言:javascript
复制
class MySection extends StatelessSection {

    String title;
    List<Preference> mPreferences;

    public MySection(String title, List<Preference> preferences) {
        // call constructor with layout resources for this Section header, footer and items 
        super(R.layout.section_header, R.layout.section_footer,  R.layout.section_item);

        this.title = title;
        this.mPreferences = preferences;
    }

    @Override
    public int getContentItemsTotal() {
        return mPreferences.size(); // number of items of this section
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        // return a custom instance of ViewHolder for the items of this section
        return new BooleanPreferenceViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
        BooleanPreferenceViewHolder itemHolder = (BooleanPreferenceViewHolder) holder;

        // bind your view here
        itemHolder.mPreferenceExplanation.setText(mPreference.get(position).getExplanation());
    }

    @Override
    public RecyclerView.ViewHolder getHeaderViewHolder(View view) {
        return new SimpleHeaderViewHolder(view);
    }

    @Override
    public void onBindHeaderViewHolder(RecyclerView.ViewHolder holder) {
        MyHeaderViewHolder headerHolder = (MyHeaderViewHolder) holder;

        // bind your header view here
        headerHolder.tvItem.setText(title);
    }
}

然后使用您的Sections设置RecyclerView

代码语言:javascript
复制
// Create an instance of SectionedRecyclerViewAdapter 
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();

MySection section1 = new MySection(mSections.get(0).getTitle(), mSections.get(0).getPreferences());
MySection section2 = new MySection(mSections.get(1).getTitle(), mSections.get(1).getPreferences());

// Add your Sections
sectionAdapter.addSection(section1);
sectionAdapter.addSection(section2);

// Set up your RecyclerView with the SectionedRecyclerViewAdapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(sectionAdapter);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34564008

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档