安卓:我怎么可以插入内CardView一个RecyclerView?入内、我怎么、RecyclerView、CardView

由网友(哇噻姑娘。)分享简介:我谈论的活动必须展现出的 RecyclerView 的通过的 CardViews 的人口为项目。我的目标是在每一个CardView展现RecyclerView反过来。下面我活动的基本XML:< XML版本=1.0编码=UTF-8&GT?;< LinearLayout中的xmlns:机器人=htt​​p:/...

我谈论的活动必须展现出的 RecyclerView 的通过的 CardViews 的人口为项目。我的目标是在每一个CardView展现RecyclerView反过来。

下面我活动的基本XML:

 < XML版本=1.0编码=UTF-8&GT?;
< LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    的xmlns:工具=htt​​p://schemas.android.com/tool​​s
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    工具:上下文=ConjActivity。>

    < android.support.v7.widget.RecyclerView
        机器人:ID =@ + ID / conjCardList
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent
        机器人:可点击=FALSE/>

< / LinearLayout中>
 

这里是我CardView的RecyclerView的布局:

 < XML版本=1.0编码=UTF-8&GT?;
< android.support.v7.widget.CardView
    的xmlns:card_view =htt​​p://schemas.android.com/apk/res-auto
    的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:ID =@ + ID / card_analysis
    机器人:layout_width =match_parent
    机器人:layout_height =WRAP_CONTENT
    机器人:layout_marginTop =@扪/ activity_vertical_margin
    机器人:layout_marginBottom =@扪/ activity_vertical_margin
    机器人:layout_marginLeft =@扪/ activity_horizo​​ntal_margin
    机器人:layout_marginRight =@扪/ activity_horizo​​ntal_margin
    机器人:填充=5DP
    card_view:cardCornerRadius =5DP>

    <的LinearLayout
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent
        机器人:方向=垂直>

        < android.support.v7.widget.RecyclerView
            机器人:ID =@ + ID / item_mode
            机器人:layout_width =WRAP_CONTENT
            机器人:layout_height =WRAP_CONTENT
            机器人:paddingTop =5DP
            机器人:以下属性来=@扪/ activity_horizo​​ntal_margin>

        < /android.support.v7.widget.RecyclerView>
    < / LinearLayout中>
< /android.support.v7.widget.CardView>
 
Android Studio新版本导入Recyclerview库的依赖 移动开发 tran sient的博客 CSDN博客

下面是两块code:

主RecyclerView(W / ViewHolders):

 公共类ConjCardAdapter扩展RecyclerView.Adapter< RecyclerView.ViewHolder> {

    私有静态上下文的背景下;
    私人LinearLayoutManager法学硕士;
    私有静态ConjFormAdapter formAdapt;
    私人的ArrayList<字符串> adapterList;
    私人列表<对象>项目;
    私有静态最终诠释
            HEADER = 0,
            CONJTYPE = 1,
            项= 2;
    私人帕拉迪格玛相提并论;
    私人字符串sel_vb;

    公共ConjCardAdapter(名单<对象>的项目){
        this.items =项目;
        上下文= ConjActivity.context;
        adapterList =新的ArrayList<字符串>();
        formAdapt =新ConjFormAdapter(adapterList);
    }

    公共RecyclerView.ViewHolder onCreateViewHolder(ViewGroup中的ViewGroup,INT viewType){

        开关(viewType){
        案例标头:
            返回新HeaderHolder(LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.card_header,ViewGroup中,FALSE));
        案例CONJTYPE:
            返回新ConjTypeHolder(LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.card_conjtext,ViewGroup中,FALSE));
        案例项目:
            返回新ItemModeHolder(LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.card_item,ViewGroup中,FALSE));
        默认:
            返回null;
        }
    }

    公共无效onBindViewHolder(RecyclerView.ViewHolder VVH,最终诠释POS){
        HeaderItem headerItem;
        字符串StringItem的;
        ArrayList的<字符串>的listItem;
        HeaderHolder HH;
        ConjTypeHolder CJH;
        ItemModeHolder IMH;

        开关(getItemViewType(POS)){
        案例标头:
            //它并没有真正的问题...
            打破;
        案例CONJTYPE:
            //它并没有真正的问题...
            打破;
        案例项目:
            的listItem =(ArrayList的<字符串>)items.get(POS);
            IMH =(ItemModeHolder)VVH;
            LLM =新LinearLayoutManager(上下文);
            imh.rv_mode.setLayoutManager(LLM);
            adapterList.addAll(的listItem);
            imh.rv_mode.setAdapter(formAdapt);
            formAdapt.notifyDataSetChanged();
            打破;
        }
    }

    @覆盖
    公众诠释getItemCount(){
        返回items.size();
    }

    @覆盖
    公众诠释getItemViewType(INT位置){

        开关(位置){
        情况下0:
            返回头部;
        情况1:
            返回CONJTYPE;
        默认:
            归还物品;
        }
    }


    静态类HeaderHolder扩展RecyclerView.ViewHolder {

        TextView的verbo,
                PARADIGMA,
                analisi;
        查看除法器;

        公共HeaderHolder(查看ItemView控件){
            超(ItemView控件);
            verbo =(TextView中)itemView.findViewById(R.id.verb);
            PARADIGMA =(TextView中)itemView.findViewById(R.id.paradigm);
            analisi =(TextView中)itemView.findViewById(R.id.analysis);
            分=(查看)itemView.findViewById(R.id.divider);
        }
    }

    静态类ConjTypeHolder扩展RecyclerView.ViewHolder {

        TextView的类型;

        公共ConjTypeHolder(查看ItemView控件){
            超(ItemView控件);
            TYPE =(TextView中)itemView.findViewById(R.id.conj_type);
        }
    }
:
    静态类ItemModeHolder扩展RecyclerView.ViewHolder {

        RecyclerView rv_mode;

        公共ItemModeHolder(查看ItemView控件){
            超(ItemView控件);
            rv_mode =(RecyclerView)itemView.findViewById(R.id.item_mode);
        }
    }

}
 

产品'RecyclerView(W / ViewHolder):

 公共类ConjFormAdapter扩展RecyclerView.Adapter< ConjFormAdapter.FormHolder> {

    私人上下文的背景下;
    私人的ArrayList<字符串>清单;
    私人帕拉迪格玛相提并论;
    私人字符串sel_vb;
    私人的ArrayList<龙> IDS;
    私人的HashMap<字符串,龙> mIdMap;
    私人StringAnalisi analisi;
    私人最终诠释IND_MODE_TYPE = 0,
            ELSE_MODE_TYPE = 1,
            TENSE_TYPE = 2,
            FORM_TYPE = 3;

    公共ConjFormAdapter(ArrayList中<字符串>列表){
        this.list =清单;
        //构造函数实现
    }

    //其他方法

    @覆盖
    公共FormHolder onCreateViewHolder(ViewGroup中的ViewGroup,INT ITEMTYPE){
        开关(ITEMTYPE){
        案例IND_MODE_TYPE:
            返回新FormHolder(LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.item_mode_ind,ViewGroup中,FALSE));
        案例ELSE_MODE_TYPE:
            返回新FormHolder(LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.item_mode_else,ViewGroup中,FALSE));
        案例TENSE_TYPE:
            返回新FormHolder(LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.item_tense,ViewGroup中,FALSE));
        默认:
            返回新FormHolder(LayoutInflater.from(viewGroup.getContext())膨胀(R.layout.item_form,ViewGroup中,FALSE));
        }
    }

    @覆盖
    公共无效onBindViewHolder(FormHolder FH,INT POS){

        fh.txt.setText(list.get(POS));

        //其他实施

    }

    @覆盖
    公众诠释getItemCount(){
        返回则为list.size();
    }

    @覆盖
    公众诠释getItemViewType(INT位置){
        字符串项=(字符串)list.get(位置);
        如果(item.equals(context.getResources()。的getString(R.string.ind))){
            返回IND_MODE_TYPE;
        } 其他if(item.equals(context.getResources().getString(R.string.subj))||item.equals(context.getResources().getString(R.string.imp))||item.equals(context.getResources().getString(R.string.inf))||item.equals(context.getResources().getString(R.string.pt))||item.equals(context.getResources().getString(R.string.ger))||item.equals(context.getResources().getString(R.string.gerv))||item.equals(context.getResources().getString(R.string.sup))){
            返回ELSE_MODE_TYPE;
        } 其他if(item.equals(context.getResources().getString(R.string.$p$ps))||item.equals(context.getResources().getString(R.string.impf))||item.equals(context.getResources().getString(R.string.fut))||item.equals(context.getResources().getString(R.string.pf))||item.equals(context.getResources().getString(R.string.ppf))||item.equals(context.getResources().getString(R.string.futant))){
            返回TENSE_TYPE;
        } 其他 {
            返回FORM_TYPE;
        }
    }

    @覆盖
    众长getItemId(INT位置){

        字符串项= list.get(位置);
        返回mIdMap.get(项目);
    }

    @覆盖
    公共无效setHasStableIds(布尔hasStableIds){
        super.setHasStableIds(真正的);
    }


    静态类FormHolder扩展RecyclerView.ViewHolder {

        TextView的TXT;
        查看divider1,DIVIDER2,divider3;

        公共FormHolder(查看ItemView控件){
            超(ItemView控件);
            TXT =(TextView中)itemView.findViewById(R.id.text1);
            divider1 =(查看)itemView.findViewById(R.id.conj_divider1);
            DIVIDER2 =(查看)itemView.findViewById(R.id.conj_divider2);
            divider3 =(查看)itemView.findViewById(R.id.conj_divider3);
        }
    }
}
 

正如你所看到的我认为这是正确的实例化第二个适配器在第一位的,对每一个项目的RecyclerView附加一个新的布局管理,并设置第二个适配器。但正如你所看到的前两个项目我的主Rec.View不包含另一个Rec.View工作得很好,但另一些则不然。

我该如何解决这个问题?拜托,我的想法。

解决方案

我面临的相同问题。你必须指定CardView内RecyclerView的布局高度。从WRAP_CONTENT将其更改为DP中的一个特定的值。嵌套RecyclerView犯规包装在其高度的内容如果父滚动纵向和类似的犯规包装在其宽度的内容时,父滚动水平。

 < XML版本=1.0编码=UTF-8&GT?;
< android.support.v7.widget.CardView
的xmlns:card_view =htt​​p://schemas.android.com/apk/res-auto
的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
机器人:ID =@ + ID / card_analysis
机器人:layout_width =match_parent
机器人:layout_height =WRAP_CONTENT
机器人:layout_marginTop =@扪/ activity_vertical_margin
机器人:layout_marginBottom =@扪/ activity_vertical_margin
机器人:layout_marginLeft =@扪/ activity_horizo​​ntal_margin
机器人:layout_marginRight =@扪/ activity_horizo​​ntal_margin
机器人:填充=5DP
card_view:cardCornerRadius =5DP>

<的LinearLayout
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直>

    < android.support.v7.widget.RecyclerView
        机器人:ID =@ + ID / item_mode
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =100dp
        机器人:paddingTop =5DP
        机器人:以下属性来=@扪/ activity_horizo​​ntal_margin>

    < /android.support.v7.widget.RecyclerView>
< / LinearLayout中>
< /android.support.v7.widget.CardView>
 

The activity I am talking about must show a RecyclerView populated by CardViews as items. My goal is to show in every CardView a RecyclerView in its turn.

Here my Activity's basic xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ConjActivity" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/conjCardList"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:clickable="false" />

</LinearLayout>

And here is the layout of my CardView's RecyclerView:

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/card_analysis"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="@dimen/activity_vertical_margin"
    android:layout_marginBottom="@dimen/activity_vertical_margin" 
    android:layout_marginLeft="@dimen/activity_horizontal_margin"
    android:layout_marginRight="@dimen/activity_horizontal_margin"
    android:padding="5dp"
    card_view:cardCornerRadius="5dp" >

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:orientation="vertical" >

        <android.support.v7.widget.RecyclerView
            android:id="@+id/item_mode"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:paddingTop="5dp"
            android:paddingLeft="@dimen/activity_horizontal_margin" >

        </android.support.v7.widget.RecyclerView>
    </LinearLayout>
</android.support.v7.widget.CardView>

So, I boldly made my first attempt by implementing two RecyclerView.Adapters, one for the (let's call it) "main" RecyclerView and one for the single ones in every CardView:

Here are the two pieces of code:

"Main" RecyclerView (w/ ViewHolders):

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

    private static Context context;
    private LinearLayoutManager llm;
    private static ConjFormAdapter formAdapt;
    private ArrayList<String> adapterList;
    private List<Object> items;
    private static final int
            HEADER = 0,
            CONJTYPE = 1,
            ITEM = 2;
    private Paradigma par;
    private String sel_vb;

    public ConjCardAdapter(List<Object> items){
        this.items = items;
        context = ConjActivity.context;
        adapterList = new ArrayList<String>();
        formAdapt = new ConjFormAdapter(adapterList);
    }

    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType){

        switch(viewType){
        case HEADER:
            return new HeaderHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_header, viewGroup, false));
        case CONJTYPE:
            return new ConjTypeHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_conjtext, viewGroup, false));
        case ITEM:
            return new ItemModeHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.card_item, viewGroup, false));
        default:
            return null;
        }
    }

    public void onBindViewHolder(RecyclerView.ViewHolder vvh, final int pos) {
        HeaderItem headerItem;
        String stringItem;
        ArrayList<String> listItem;
        HeaderHolder hh;
        ConjTypeHolder cjh;
        ItemModeHolder imh;

        switch(getItemViewType(pos)){
        case HEADER:
            // it doesn't really matter...
            break;
        case CONJTYPE:
            // it doesn't really matter...
            break;
        case ITEM:
            listItem = (ArrayList<String>) items.get(pos);
            imh = (ItemModeHolder) vvh;
            llm = new LinearLayoutManager(context);
            imh.rv_mode.setLayoutManager(llm);
            adapterList.addAll(listItem);
            imh.rv_mode.setAdapter(formAdapt);
            formAdapt.notifyDataSetChanged();
            break;
        }           
    }

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

    @Override
    public int getItemViewType(int position) {

        switch(position){
        case 0:
            return HEADER;
        case 1:
            return CONJTYPE;
        default:
            return ITEM;
        }
    }


    static class HeaderHolder extends RecyclerView.ViewHolder{

        TextView verbo,
                paradigma,
                analisi;
        View divider;

        public HeaderHolder(View itemView) {
            super(itemView);
            verbo = (TextView) itemView.findViewById(R.id.verb);
            paradigma = (TextView) itemView.findViewById(R.id.paradigm);
            analisi = (TextView) itemView.findViewById(R.id.analysis);
            divider = (View) itemView.findViewById(R.id.divider);
        }
    }

    static class ConjTypeHolder extends RecyclerView.ViewHolder{

        TextView type;

        public ConjTypeHolder(View itemView) {
            super(itemView);
            type = (TextView) itemView.findViewById(R.id.conj_type);
        }
    }
:
    static class ItemModeHolder extends RecyclerView.ViewHolder{

        RecyclerView rv_mode;

        public ItemModeHolder(View itemView) {
            super(itemView);
            rv_mode = (RecyclerView) itemView.findViewById(R.id.item_mode);
        }
    }

}

Items' RecyclerView (w/ ViewHolder):

public class ConjFormAdapter extends RecyclerView.Adapter<ConjFormAdapter.FormHolder>{

    private Context context;
    private ArrayList<String> list;
    private Paradigma par;
    private String sel_vb;
    private ArrayList<Long> ids;
    private HashMap<String, Long> mIdMap;
    private StringAnalisi analisi;
    private final int IND_MODE_TYPE=0,
            ELSE_MODE_TYPE=1,
            TENSE_TYPE=2,
            FORM_TYPE=3;

    public ConjFormAdapter(ArrayList<String> list){
        this.list = list;
        // Constructor implementation
    }

    // other methods

    @Override
    public FormHolder onCreateViewHolder(ViewGroup viewGroup, int itemType) {
        switch(itemType){
        case IND_MODE_TYPE:
            return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_mode_ind, viewGroup, false));
        case ELSE_MODE_TYPE:
            return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_mode_else, viewGroup, false));
        case TENSE_TYPE:
            return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_tense, viewGroup, false));
        default:
            return new FormHolder(LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_form, viewGroup, false));
        }
    }

    @Override
    public void onBindViewHolder(FormHolder fh, int pos) {

        fh.txt.setText(list.get(pos));

        // other implementation

    }

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

    @Override
    public int getItemViewType(int position) {
        String item = (String) list.get(position);
        if(item.equals(context.getResources().getString(R.string.ind))){
            return IND_MODE_TYPE;
        } else if(item.equals(context.getResources().getString(R.string.subj))||item.equals(context.getResources().getString(R.string.imp))||item.equals(context.getResources().getString(R.string.inf))||item.equals(context.getResources().getString(R.string.pt))||item.equals(context.getResources().getString(R.string.ger))||item.equals(context.getResources().getString(R.string.gerv))||item.equals(context.getResources().getString(R.string.sup))){
            return ELSE_MODE_TYPE;
        } else if(item.equals(context.getResources().getString(R.string.pres))||item.equals(context.getResources().getString(R.string.impf))||item.equals(context.getResources().getString(R.string.fut))||item.equals(context.getResources().getString(R.string.pf))||item.equals(context.getResources().getString(R.string.ppf))||item.equals(context.getResources().getString(R.string.futant))){
            return TENSE_TYPE;
        } else {
            return FORM_TYPE;
        }
    }

    @Override
    public long getItemId(int position) {

        String item = list.get(position);
        return mIdMap.get(item);
    }

    @Override
    public void setHasStableIds(boolean hasStableIds) {
        super.setHasStableIds(true);
    }


    static class FormHolder extends RecyclerView.ViewHolder{

        TextView txt;
        View divider1, divider2, divider3;

        public FormHolder(View itemView) {
            super(itemView);
            txt = (TextView) itemView.findViewById(R.id.text1);
            divider1 = (View) itemView.findViewById(R.id.conj_divider1);
            divider2 = (View) itemView.findViewById(R.id.conj_divider2);
            divider3 = (View) itemView.findViewById(R.id.conj_divider3);
        }
    }
}

As you can see I thought it was right to instantiate the second adapter in the first one, and for every item's RecyclerView to attach a new LayoutManager and to set the second adapter. But as you can see the first two items of my "main" Rec.View which don't contain another Rec.View work just fine, but the others don't.

How can I solve the issue? Please, I am out of ideas.

解决方案

I faced the exact same problem. You have to specify the layout height of the RecyclerView inside the CardView. Change it from wrap_content to a specific value in dp. Nested RecyclerView doesnt wrap the content in its height if the parent scrolling is VERTICAL and similarly doesnt wrap the content in its width when the parent scrolling is HORIZONTAL.

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
xmlns:card_view="http://schemas.android.com/apk/res-auto"
xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@+id/card_analysis"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="@dimen/activity_vertical_margin"
android:layout_marginBottom="@dimen/activity_vertical_margin" 
android:layout_marginLeft="@dimen/activity_horizontal_margin"
android:layout_marginRight="@dimen/activity_horizontal_margin"
android:padding="5dp"
card_view:cardCornerRadius="5dp" >

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <android.support.v7.widget.RecyclerView
        android:id="@+id/item_mode"
        android:layout_width="wrap_content"
        android:layout_height="100dp"
        android:paddingTop="5dp"
        android:paddingLeft="@dimen/activity_horizontal_margin" >

    </android.support.v7.widget.RecyclerView>
</LinearLayout>
</android.support.v7.widget.CardView>

阅读全文

相关推荐

最新文章