Android RecyclerView中的RecyclerView

Android RecyclerView中的RecyclerView,android,android-recyclerview,Android,Android Recyclerview,我想创建嵌套的RecyclerViews,问题是只显示父对象 父适配器 public class SectionsAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { Context mContext; List<Section> mSections; public SectionsAdapter(Context context, List<Section>

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

父适配器

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();
    }
}
子视图保持器

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

}

所以我注意到它只显示父标题,它的recyclerview是空的。此外,子onBindViewHolder方法未调用

只需一个
RecyclerView
,即可实现您想要的功能,并正确覆盖
getItemViewType
方法。你可以看到一个例子

下面是使用库中的
部分
首选项
布尔首选项视图持有者
类的示例

首先创建一个截面类:

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

两个recyclerviews的布局XML是什么样子的?
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);
    }

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