在 android 中的回收器视图内部创建回收器视图
Create a recycler view insider a recycler view in android
如果我想在android中的一个回收视图中创建一个回收视图,如何处理第一个回收视图容器中的视图持有者以及如何处理两个回收视图中的传输?请给我一些建议。非常感谢。
Problem Statement : We have to display three items in parent recycler view. First two items are normal cardViews and the third item is child recycler view.
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>
希望对您有所帮助!!
如果我想在android中的一个回收视图中创建一个回收视图,如何处理第一个回收视图容器中的视图持有者以及如何处理两个回收视图中的传输?请给我一些建议。非常感谢。
Problem Statement : We have to display three items in parent recycler view. First two items are normal cardViews and the third item is child recycler view.
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>
希望对您有所帮助!!