【问题标题】:how to Inflate multiple card view layout如何充气多卡视图布局
【发布时间】:2015-11-23 11:22:20
【问题描述】:

我有一个列表视图。显示为卡片视图。在卡片视图中,我有一个图像,我想根据对象类型动态更改它。因此,为此我创建了两种不同的布局,其中包含小图像和大图像。我创建了一个适配器并尝试在 onCreateViewHolder 中填充两个不同的布局。我在这些代码行上得到一个空指针异常。不知道我错过了什么...请帮助..

itemViewHolder.big.setImageDrawable(drawable1);
  itemViewHolder.small.setImageDrawable(drawable);
public class IAdapter extends RecyclerView.Adapter<IAdapter.ItemViewHolder> {

适配器代码

    public class ItemAdapter extends RecyclerView.Adapter<IAdapter.ItemViewHolder> {

    List<Expense> items;
    public static final int TYPE1 = 1;
    public static final int TYPE2 = 2;

    IAdapter(List<Expense> items) {

        this.items = items;

    }

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

    }

    @Override
    public int getItemViewType(int position) {

        Expense e = new Expense();
        if (TYPE1 == 1) {
            int type = e.getExpenseType();
            return type;
        } else {
            return TYPE2;
        }

    }

    @Override
    public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {

        itemViewHolder.amount.setText(items.get(i).amount);
        itemViewHolder.expense.setText(items.get(i).expense);
        TextDrawable drawable = TextDrawable.builder()
                .beginConfig()
                .withBorder(4)
                .textColor(Color.BLACK)
                .useFont(Typeface.DEFAULT)
                .fontSize(25)
                .bold()
                .toUpperCase()
                .endConfig()
                .buildRound("11:00", Color.GRAY);
        itemViewHolder.small.setImageDrawable(drawable);

        TextDrawable drawable1 = TextDrawable.builder()
                .beginConfig()
                .withBorder(4)
                .textColor(Color.BLACK)
                .useFont(Typeface.DEFAULT)
                .fontSize(25)
                .bold()
                .toUpperCase()
                .endConfig()
                .buildRound("10 Jan", Color.CYAN);
        itemViewHolder.big.setImageDrawable(drawable1);

    }

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup, int viewType) {

        if (viewType == TYPE1) {
            View itemView = LayoutInflater.
                    from(viewGroup.getContext()).
                    inflate(R.layout.cardlayout, viewGroup, false);
            return new ItemViewHolder(itemView, viewType);
        } else {
            View itemView = LayoutInflater.
                    from(viewGroup.getContext()).
                    inflate(R.layout.bigcircle, viewGroup, false);
            ItemViewHolder ivh = new ItemViewHolder(itemView, viewType);
            return ivh;
        }
    }

    public static class ItemViewHolder extends RecyclerView.ViewHolder {
        CardView cv;
        TextView amount;
        TextView expense;
        ImageView small;
        ImageView big;

        ItemViewHolder(View itemView, int viewType) {
            super(itemView);
            amount = (TextView) itemView.findViewById(R.id.txtAmount);
            expense = (TextView) itemView.findViewById(R.id.txtexpense);
            cv = (CardView) itemView.findViewById(R.id.card_view);
            small = (ImageView) itemView.findViewById(R.id.small);
            big=(ImageView)itemView.findViewById(R.id.big);
            //   cv1 = (CardView) itemView.findViewById(R.id.card_view);

            //TextDrawable drawable1 = TextDrawable.builder()
            // .buildRound("20 Jan", Color.RED);

        }
    }


    @Override
    public void onAttachedToRecyclerView(RecyclerView recyclerView) {
        super.onAttachedToRecyclerView(recyclerView);
    }

}

卡片布局代码

<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_width="match_parent"
android:layout_height="match_parent"
android:weightSum="1"
android:orientation="vertical"
android:measureWithLargestChild="false"
android:background="@android:color/white">
<!-- A CardView that contains a TextView -->

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="80dp"
    card_view:cardCornerRadius="4dp"
    android:background="@android:color/white">


    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/relativeLayout"
        android:background="@android:color/white"
        android:layout_alignParentTop="true">


        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:id="@+id/txtAmount"
            android:text="text1"
            android:layout_centerVertical="true"
            android:layout_toLeftOf="@+id/linearLayout"
            android:layout_toStartOf="@+id/linearLayout"
            android:layout_marginRight="24dp"
            android:layout_marginEnd="24dp" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:weightSum="1"
            android:id="@+id/linearLayout"
            android:gravity="center_vertical"
            android:layout_alignParentTop="true"
            android:layout_centerHorizontal="true">


            <ImageView
                android:layout_width="40dp"
                android:layout_height="25dp"
                android:id="@+id/imageView2"
                android:background="@drawable/line" />

            <ImageView

                android:id="@+id/small"
                android:focusableInTouchMode="false"
                android:layout_width="40dp"
                android:layout_height="40dp"
                android:background="@drawable/circle"/>


            <ImageView
                android:layout_width="40dp"
                android:layout_height="25dp"
                android:id="@+id/imageView3"
                android:background="@drawable/line" />
        </LinearLayout>

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textAppearance="?android:attr/textAppearanceMedium"
            android:text="Medium Text"
            android:id="@+id/txtexpense"
            android:layout_centerVertical="true"
            android:layout_toRightOf="@+id/linearLayout"
            android:layout_toEndOf="@+id/linearLayout"
            android:layout_marginLeft="24dp"
            android:layout_marginStart="24dp" />
    </RelativeLayout>

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

大圆卡片布局代码

  <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_width="match_parent"
    android:layout_height="match_parent"
    android:weightSum="1"
    android:orientation="vertical"
    android:measureWithLargestChild="false">
    <!-- A CardView that contains a TextView -->

    <android.support.v7.widget.CardView
        xmlns:card_view="http://schemas.android.com/apk/res-auto"
        android:id="@+id/card_view1"
        android:layout_width="match_parent"
        android:layout_height="80dp"
        card_view:cardCornerRadius="4dp"
        android:background="@android:color/white">


        <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:id="@+id/relativeLayout"
            android:background="@android:color/white"
            android:layout_alignParentTop="true">


            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:id="@+id/txtAmount"
                android:text="text1"
                android:layout_centerVertical="true"
                android:layout_toLeftOf="@+id/linearLayout"
                android:layout_toStartOf="@+id/linearLayout"
                android:layout_marginRight="24dp"
                android:layout_marginEnd="24dp" />

            <LinearLayout
                android:orientation="vertical"
                android:layout_width="wrap_content"
                android:layout_height="match_parent"
                android:weightSum="1"
                android:id="@+id/linearLayout"
                android:gravity="center_vertical"
                android:layout_alignParentTop="true"
                android:layout_centerHorizontal="true">


                <ImageView
                    android:layout_width="50dp"
                    android:layout_height="25dp"
                    android:id="@+id/imageView2"
                    android:background="@drawable/line" />

                <ImageView

                    android:id="@+id/big"
                    android:focusableInTouchMode="false"
                    android:layout_width="50dp"
                    android:layout_height="50dp"
                    android:background="@drawable/circle1"/>


                <ImageView
                    android:layout_width="50dp"
                    android:layout_height="25dp"
                    android:id="@+id/imageView3"
                    android:background="@drawable/line" />
            </LinearLayout>

            <TextView
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:textAppearance="?android:attr/textAppearanceMedium"
                android:text="Medium Text"
                android:id="@+id/txtexpense"
                android:layout_centerVertical="true"
                android:layout_toRightOf="@+id/linearLayout"
                android:layout_toEndOf="@+id/linearLayout"
                android:layout_marginLeft="24dp"
                android:layout_marginStart="24dp" />
        </RelativeLayout>

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

我错过了什么???

【问题讨论】:

    标签: java android listview layout


    【解决方案1】:

    这是因为您使用的是从 onCreateViewHolder 方法传递到 onBindViewHolder 方法中的 ItemViewHolder。它失败的原因是,您有 2 个不同的膨胀视图通过了一个包含 ID 为 big 的视图元素和另一个 ID 为 small 的视图元素。因此, itemViewHolder.big 或 itemViewHolder.small 都变为 null。这会引发NullPointerException

    我认为你处理这个问题的方式是正确的。

    选项一: 这是实现这一目标的不同方式。

    如果你对这两个有完全不同的布局,你必须这样做。但是如果卡片的布局都是一样的,只有大图和小图在变化,我建议你保持单一的布局,并在语法上改变图像视图。

    选项二

    你的方法。我建议你坚持下去,因为这是这样做的优雅方式。但是你将不得不做一些小的调整。

        @Override
        public int getItemViewType(int position) {
              return items.get(position).getExpenseType();// Assume that this return 1 0r 2
        }
    

    我建议你在这里设置值之前检查类型,假设你有一个 TYPE 类变量来保存每个项目的类型。

    @Override
        public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {
    
           itemViewHolder.amount.setText(items.get(i).amount);
           itemViewHolder.expense.setText(items.get(i).expense);
    
           if(getItemViewType(i) == 1){
            TextDrawable drawable = TextDrawable.builder()
                    .beginConfig()
                    .withBorder(4)
                    .textColor(Color.BLACK)
                    .useFont(Typeface.DEFAULT)
                    .fontSize(25)
                    .bold()
                    .toUpperCase()
                    .endConfig()
                    .buildRound("11:00", Color.GRAY);
            itemViewHolder.small.setImageDrawable(drawable);
           }else{
            TextDrawable drawable1 = TextDrawable.builder()
                    .beginConfig()
                    .withBorder(4)
                    .textColor(Color.BLACK)
                    .useFont(Typeface.DEFAULT)
                    .fontSize(25)
                    .bold()
                    .toUpperCase()
                    .endConfig()
                    .buildRound("10 Jan", Color.CYAN);
            itemViewHolder.big.setImageDrawable(drawable1);
          }
        }
    

    这并没有改变我的答案。但这会给你一个好主意。你缺少的空洞东西在这个,

    public static class ItemViewHolder extends RecyclerView.ViewHolder {
            CardView cv;
            TextView amount;
            TextView expense;
            ImageView small;
            ImageView big;
    
            ItemViewHolder(View itemView, int viewType) {
                super(itemView);
                amount = (TextView) itemView.findViewById(R.id.txtAmount);
                expense = (TextView) itemView.findViewById(R.id.txtexpense);
                cv = (CardView) itemView.findViewById(R.id.card_view);
                small = (ImageView) itemView.findViewById(R.id.small);
                big=(ImageView)itemView.findViewById(R.id.big);
                //   cv1 = (CardView) itemView.findViewById(R.id.card_view);
    
                //TextDrawable drawable1 = TextDrawable.builder()
                // .buildRound("20 Jan", Color.RED);
    
            }
        }
    

    即使你这样做

    small = (ImageView) itemView.findViewById(R.id.small);
    big=(ImageView)itemView.findViewById(R.id.big);
    

    小变量或大变量都将被分配null。但是你必须在调用它的方法之前检查它。否则它会给出一个NullPointerException

    编辑:

    或者你可以这样做,

    @Override
    public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
    
        View itemView;
        if (getItemViewType(i)==1) {
            itemView = LayoutInflater.
                    from(viewGroup.getContext()).
                    inflate(R.layout.cardlayout, viewGroup, false);
    
        } else {
            itemView = LayoutInflater.from(viewGroup.getContext()).
                    inflate(R.layout.bigcircle, viewGroup, false);
        }
    
        return new ItemViewHolder(itemView,viewType);
    }
    

    【讨论】:

    • 谢谢你的回复。你能解释一下正确的代码吗??
    • 我有两种不同的布局。所以基于类型我想膨胀布局。设置图像的代码可能在错误的地方吗???
    • 我已经引用了这个链接,但无法在我的代码中实现。你能帮我吗?..stackoverflow.com/questions/25914003/…
    • 但是我想要两张图片的尺寸不同,所以我想到了不同的卡片。如何更改同一张卡片中的图像大小??
    • 我仍然对此感到困惑。你能告诉我正确的代码吗?
    【解决方案2】:

    @覆盖 public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {

        if (getItemViewType(i)==1) {
            View itemView = LayoutInflater.
                    from(viewGroup.getContext()).
                    inflate(R.layout.cardlayout, viewGroup, false);
            return new ItemViewHolder(itemView,viewType);
        } else {
            View itemView = LayoutInflater.from(viewGroup.getContext()).
                    inflate(R.layout.bigcircle, viewGroup, false);
            ItemViewHolder ivh = new ItemViewHolder(itemView, viewType);
            return ivh;
        }
    }
    

    是这样吗??

    【讨论】:

      【解决方案3】:
      public class IAdapter extends RecyclerView.Adapter<IAdapter.ItemViewHolder> {
      
          List<Expense> items;
          public static final int TYPE1=1;
      
      
      
          IAdapter(List<Expense> items) {
      
              this.items = items;
      
          }
      
          @Override
          public int getItemCount() {
              return items.size();
      
          }
      
          @Override
              public int getItemViewType(int position) {
                  return items.get(position).getExpenseType();// Assume that this return 1 0r 2
              }
      
          @Override
          public void onBindViewHolder(ItemViewHolder itemViewHolder, int i) {
      
              itemViewHolder.amount.setText(items.get(i).amount);
              itemViewHolder.expense.setText(items.get(i).expense);
          }
      
          @Override
          public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
      
              if (viewType==TYPE1) {
                  View itemView = LayoutInflater.
                          from(viewGroup.getContext()).
                          inflate(R.layout.cardlayout, viewGroup, false);
                  return new ItemViewHolder(itemView,viewType);
              } else {
                  View itemView = LayoutInflater.from(viewGroup.getContext()).
                          inflate(R.layout.bigcircle, viewGroup, false);
                  ItemViewHolder ivh = new ItemViewHolder(itemView, viewType);
                  return ivh;
              }
          }
      
      
          public static class ItemViewHolder extends RecyclerView.ViewHolder {
              CardView cv;
              TextView amount;
              TextView expense;
              ImageView small;
              ImageView big;
      
              ItemViewHolder(View itemView, int viewType) {
                  super(itemView);
                  amount = (TextView) itemView.findViewById(R.id.txtAmount);
                  expense = (TextView) itemView.findViewById(R.id.txtexpense);
                  cv = (CardView) itemView.findViewById(R.id.card_view);
      
                  if(viewType==TYPE1) {
                      small = (ImageView) itemView.findViewById(R.id.small);
                      TextDrawable drawable = TextDrawable.builder()
                              .beginConfig()
                              .withBorder(4)
                              .textColor(Color.BLACK)
                              .useFont(Typeface.DEFAULT)
                              .fontSize(25)
                              .bold()
                              .toUpperCase()
                              .endConfig()
                              .buildRound("11:00", Color.GRAY);
                      small.setImageDrawable(drawable);
                  }else{
                      big=(ImageView)itemView.findViewById(R.id.big);
                      TextDrawable drawable = TextDrawable.builder()
                              .beginConfig()
                              .withBorder(4)
                              .textColor(Color.BLACK)
                              .useFont(Typeface.DEFAULT)
                              .fontSize(25)
                              .bold()
                              .toUpperCase()
                              .endConfig()
                              .buildRound("10Jan", Color.CYAN);
                      big.setImageDrawable(drawable);
                  }
      
                  //   cv1 = (CardView) itemView.findViewById(R.id.card_view);
      
                  //TextDrawable drawable1 = TextDrawable.builder()
                  // .buildRound("20 Jan", Color.RED);
      
              }
          }
      
      
          @Override
          public void onAttachedToRecyclerView(RecyclerView recyclerView) {
              super.onAttachedToRecyclerView(recyclerView);
          }
      
      }
      

      这给出了想要的结果..

      【讨论】:

        猜你喜欢
        • 2021-11-13
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-06-10
        • 1970-01-01
        相关资源
        最近更新 更多