android–RecyclerView和普通LinearLayout内部布局的不同宽度

android–RecyclerView和普通LinearLayout内部布局的不同宽度,第1张

概述我有一个卡片视图类,看起来像:publicclassCardTestextendsLinearLayout{publicCardTest(Contextcontext){super(context);LayoutInflater.from(getContext()).inflate(R.layout.card_main,this);}}card_main.xml如下:<Linea

我有一个卡片视图类,看起来像:

public class CardTest extends linearLayout {    public CardTest(Context context) {            super(context);            LayoutInflater.from(getContext()).inflate(R.layout.card_main, this);        }}

card_main.xml如下:

<linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    xmlns:card_vIEw="http://schemas.androID.com/apk/res-auto"    androID:layout_height="wrap_content"    androID:layout_wIDth="fill_parent"    androID:orIEntation="vertical"    >        <androID.support.v7.Widget.CardVIEw            androID:layout_height="wrap_content"            androID:layout_wIDth="fill_parent"            card_vIEw:cardCornerRadius="4dp">            <TextVIEw                androID:ID="@+ID/tv"                androID:layout_wIDth="wrap_content"                androID:layout_height="wrap_content"                androID:text="Moscow"/>        </androID.support.v7.Widget.CardVIEw></linearLayout>

然后,如果我在我的片段中

@OverrIDe    public VIEw onCreateVIEw(LayoutInflater inflater, VIEwGroup container,                             Bundle savedInstanceState) {        VIEw vIEw = inflater.inflate(R.layout.vIEw_vll_scrollbar, null);        linearLayout ll = (linearLayout) vIEw.findVIEwByID(R.ID.vll);        ll.addVIEw(new CardTest(this.getActivity()));        return vIEw;    }

我会看到这个结果(实际上,正如我所料):

但是如果我现在使用带有此代码的RecyclerVIEw

 public class Calendaradapter extends RecyclerVIEw.Adapter<CalendarVIEwHolder> {        private List<ItemCalendar> mList;        public Calendaradapter(List<ItemCalendar> List) {            this.mList = List;        }        @OverrIDe        public int getItemCount() {            return mList.size();        }        @OverrIDe        public voID onBindVIEwHolder(CalendarVIEwHolder calendarVIEwHolder, int i) {            ItemCalendar ci = mList.get(i);            calendarVIEwHolder.headerText.setText(ci.getCity());        }        @OverrIDe        public CalendarVIEwHolder onCreateVIEwHolder(VIEwGroup vIEwGroup, int i) {            VIEw itemVIEw = new CardTest(vIEwGroup.getContext());            return new CalendarVIEwHolder(itemVIEw);        }    }    public static class CalendarVIEwHolder extends RecyclerVIEw.VIEwHolder {        protected TextVIEw headerText;        protected TextVIEw bodyText;        public CalendarVIEwHolder(VIEw v) {            super(v);            headerText = (TextVIEw) v.findVIEwByID(R.ID.card_extender_header_text);        }    }

我会得到这个结果

为什么我的卡片的水平尺寸不同?它可能是具有背景的东西吗?

解决方法:

基本上CardTest成为它不打算的布局.
在你的适配器中,你创建了一个CardTest实例,而不是为它提供布局参数,因此CardTest的布局结构将与card_main.xml不同:

<com.yourpackage.CardTest    layout_wIDth="wrap_content"    layout_height="wrap_content"><!--inflated hIErarchy is added into your custom vIEwgroup--><linearLayout xmlns:androID="http://schemas.androID.com/apk/res/androID"    xmlns:tools="http://schemas.androID.com/tools"    xmlns:card_vIEw="http://schemas.androID.com/apk/res-auto"    androID:layout_height="wrap_content"    androID:layout_wIDth="fill_parent"    androID:orIEntation="vertical"    >        <androID.support.v7.Widget.CardVIEw            androID:layout_height="wrap_content"            androID:layout_wIDth="fill_parent"            card_vIEw:cardCornerRadius="4dp">            <TextVIEw                androID:ID="@+ID/tv"                androID:layout_wIDth="wrap_content"                androID:layout_height="wrap_content"                androID:text="Moscow"/>        </androID.support.v7.Widget.CardVIEw></linearLayout></com.yourpackage.CardTest>

那不是你的意思,不是吗?

只需在card_main.xml中删除外部linearLayout(您的视图已经是linearLayout本身):

<androID.support.v7.Widget.CardVIEw        xmlns:androID= "http://schemas.androID.com/apk/res/androID"        androID:layout_height="wrap_content"        androID:layout_wIDth="fill_parent"        card_vIEw:cardCornerRadius="4dp">        <TextVIEw            androID:ID="@+ID/tv"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="Moscow"/>    </androID.support.v7.Widget.CardVIEw>

然后添加到您的适配器方法:

 @OverrIDe        public CalendarVIEwHolder onCreateVIEwHolder(VIEwGroup vIEwGroup, int i) {            VIEw itemVIEw = new CardTest(vIEwGroup.getContext());            RecyclerVIEw.LayoutParams lp = new RecyclerVIEw.LayoutParams(    VIEwGroup.LayoutParams.MATCH_PARENT, //wIDth    VIEwGroup.LayoutParams.WRAP_CONTENT);//height            itemVIEw.setLayoutParams(lp);//overrIDe default layout params            return new CalendarVIEwHolder(itemVIEw);        }

…并向莫斯科发送热烈的问候,占据整个屏幕宽度:)

编辑:您也可以考虑不动态创建CardTest视图层次结构,而是在XML中定义它并直接在onCreateVIEwHolder(..)中对其进行充气.

布局/ my_item.xml

<com.yourpackage.CardTest        xmlns:androID= "http://schemas.androID.com/apk/res/androID"        layout_wIDth="match_parent"        layout_height="wrap_content"><androID.support.v7.Widget.CardVIEw        androID:layout_height="wrap_content"        androID:layout_wIDth="fill_parent"        card_vIEw:cardCornerRadius="4dp">        <TextVIEw            androID:ID="@+ID/tv"            androID:layout_wIDth="wrap_content"            androID:layout_height="wrap_content"            androID:text="Moscow"/>    </androID.support.v7.Widget.CardVIEw></com.yourpackage.CardTest>

在代码中:

    @OverrIDe    public CalendarVIEwHolder onCreateVIEwHolder(VIEwGroup vIEwGroup, int i) {        VIEw itemVIEw = LayoutInflater.from(vIEwGroup.getContext()).inflate(R.layout.my_item, vIEwGroup, false);        return new CalendarVIEwHolder(itemVIEw);    }
总结

以上是内存溢出为你收集整理的android – RecyclerView和普通LinearLayout内部布局的不同宽度全部内容,希望文章能够帮你解决android – RecyclerView和普通LinearLayout内部布局的不同宽度所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1107740.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-28
下一篇 2022-05-28

发表评论

登录后才能评论

评论列表(0条)

保存