在android中创建一个回收站视图内部的回收站视图

时间:2017-04-01 01:13:37

标签: android-recyclerview android-viewholder

如果我想在android中创建一个回收者视图内部的回收者视图,如何在回收者视图的第一个容器中处理视图持有者以及如何在两个回收者视图中处理传输?请给我一些建议。非常感谢你。

1 个答案:

答案 0 :(得分:0)

  

问题陈述:我们必须在父回收站视图中显示三个项目。前两项是普通的cardViews,第三项是子回收站视图。

Screenshot

 The top two items are card views and the third item is a list of hotels.

MainActivity.class

public class **MainActivity** extends AppCompatActivity {
  @Override
  protected void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    RecyclerView recyclerView = findViewById(R.id.recycler_view);
    ArrayList<DataModel> items = new ArrayList<>();
    items.add(new DataModel("Bus"));
    items.add(new DataModel("Flight"));
    ArrayList<String> hotelsList=new ArrayList<>();
    hotelsList.add("Hotel 1");
    hotelsList.add("Hotel 2");
    hotelsList.add("Hotel 2");
    items.add(new DataModel("Hotels",hotelsList));
    LinearLayoutManager linearLayoutManager = new LinearLayoutManager(MainActivity.this);
    linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
    recyclerView.setLayoutManager(linearLayoutManager);
    ParentAdapter parentAdapter = new ParentAdapter(items,MainActivity.this);
    recyclerView.setAdapter(parentAdapter);
  }
}

<强> activity_main.xml中

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

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

</RelativeLayout>

<强> DataModel.class

public class DataModel {

  private String title;
  private ArrayList<String> hotels;

  public DataModel(String title){
    this.title=title;
  }

  public DataModel(String title, ArrayList<String> hotels){
    this.title=title;
    this.hotels=hotels;
  }

  public String getTitle() {
    return title;
  }

  public ArrayList<String> getHotels() {
    return hotels;
  }

}

ParentAdapter.class :父级回收站视图

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

      private ArrayList<DataModel> items;
      private Context mContext;

      public ParentAdapter(ArrayList<DataModel> items, Context mContext) {
        this.items = items;
        this.mContext=mContext;
      }


      @Override
      public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
        if (viewType == ViewType.NORMAL_ITEM) {
          return new NormalHolder(layoutInflater.inflate(R.layout.normal_view, parent, false));
        } else if (viewType == ViewType.HOTELS_LIST_ITEM) {
          return new ListHolder(layoutInflater.inflate(R.layout.list_view, parent, false));
        }
        return null;
      }


      @Override
      public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        int cardType = getItemViewType(position);
        switch (cardType) {
          case ViewType.NORMAL_ITEM:
            NormalHolder normalHolder=(NormalHolder) holder;
            normalHolder.title.setText(items.get(position).getTitle());
            break;
          case ViewType.HOTELS_LIST_ITEM:
            ListHolder listHolder=(ListHolder) holder;
            HotelCardAdapter hotelCardAdapter = new HotelCardAdapter(mContext, items.get(position).getHotels());
            LinearLayoutManager linearLayoutManager = new LinearLayoutManager(mContext);
            linearLayoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
            listHolder.hotelsList.setLayoutManager(linearLayoutManager);
            listHolder.hotelsList.setAdapter(hotelCardAdapter);
            break;
        }
      }

      private interface ViewType {
        int NORMAL_ITEM = 0;
        int HOTELS_LIST_ITEM = 1;
      }

      @Override
      public int getItemViewType(int position) {
        if (position == 0 || position == 1) {
          return ViewType.NORMAL_ITEM;
        } else return ViewType.HOTELS_LIST_ITEM;
      }

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

      private class NormalHolder extends RecyclerView.ViewHolder {
        TextView title;
        public NormalHolder(View inflate) {
          super(inflate);
          title=inflate.findViewById(R.id.title);
        }
      }

      private class ListHolder extends RecyclerView.ViewHolder {
        RecyclerView hotelsList;

        public ListHolder(View inflate) {
          super(inflate);
          hotelsList = inflate.findViewById(R.id.hotel_list);
        }
      }
    }

<强> normal_view.xml

 <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
                                        xmlns:card_view="http://schemas.android.com/apk/res-auto"
                                        android:layout_width="match_parent"
                                        android:layout_height="wrap_content"
                                        android:layout_marginBottom="5dp"
                                        android:layout_marginTop="5dp"
                                        card_view:cardCornerRadius="2dp"
                                        card_view:contentPadding="10dp">

      <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="100dp"
        android:padding="6dp">


        <TextView
          android:id="@+id/title"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Bus"
          android:textColor="@color/colorPrimary"
          android:textSize="20sp"/>

        <Button
          android:id="@+id/view_all"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:layout_alignParentEnd="true"
          android:layout_alignParentRight="true"
          android:gravity="center"
          android:text="View All"
          android:textSize="12sp"/>


      </RelativeLayout>

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

<强> list_view.xml

  <?xml version="1.0" encoding="utf-8"?>
    <android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android"
                                        xmlns:card_view="http://schemas.android.com/apk/res-auto"
                                        android:layout_width="match_parent"
                                        android:layout_height="wrap_content"
                                        android:layout_marginBottom="5dp"
                                        android:layout_marginTop="5dp"
                                        card_view:cardCornerRadius="2dp"
                                        card_view:contentPadding="10dp">

      <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="6dp">

        <TextView
          android:id="@+id/header"
          android:layout_width="wrap_content"
          android:layout_height="wrap_content"
          android:text="Hotels"
          android:textColor="@color/colorPrimary"
          android:textSize="17sp"/>

        <android.support.v7.widget.RecyclerView
          android:id="@+id/hotel_list"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_below="@+id/header"
          android:layout_marginTop="12dp"
          android:orientation="horizontal"/>


      </RelativeLayout>

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

HotelCardAdapter.class :儿童回收站视图

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

  private ArrayList<String> hotelsObject;
  private Context context;

  public HotelCardAdapter(Context context, ArrayList<String> hotelsObject) {
    this.hotelsObject = hotelsObject;
    this.context = context;

  }

  @Override
  public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    LayoutInflater layoutInflater = LayoutInflater.from(parent.getContext());
    return new HotelCarouselHolder(layoutInflater.inflate(R.layout.hotel_carousel_item, null));
  }

  @Override
  public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
    HotelCarouselHolder hotelCarouselHolder = (HotelCarouselHolder) holder;
    hotelCarouselHolder.title.setText(hotelsObject.get(position));
  }

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

  private class HotelCarouselHolder extends RecyclerView.ViewHolder {
    private TextView title;

    public HotelCarouselHolder(View inflate) {
      super(inflate);
      title = inflate.findViewById(R.id.title);
    }
  }
}

<强> hotel_carousel_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
  xmlns:android="http://schemas.android.com/apk/res/android"
  android:layout_width="match_parent"
  android:layout_height="match_parent"
  android:padding="16dp">

  <RelativeLayout
    android:id="@+id/hotel_details_layout"
    android:layout_width="match_parent"
    android:layout_height="wrap_content">

    <ImageView
      android:id="@+id/hotel_image"
      android:layout_width="256dp"
      android:layout_height="144dp"
      android:scaleType="centerCrop"
      android:src="#999999"/>

    <TextView
      android:id="@+id/title"
      android:layout_width="wrap_content"
      android:layout_height="wrap_content"
      android:layout_below="@+id/hotel_image"
      android:textSize="16sp"
      android:text="Hotels 1"/>

  </RelativeLayout>
</RelativeLayout>

希望这会有所帮助!!

相关问题