I am trying to implement horizontal scrolling of a RecyclerView inside another RecyclerView, which means the parent RecyclerView (vertical scrolling) and the child RecyclerView (horizontal scrolling) inside the parent RecyclerView. I referred to a couple of questions regarding this requirement and found a better solution from this question. How to get ListView / RecyclerView inside the parent RecyclerView? and successfully implemented. After the child adapter’s layout file changes the scrolling of the child RecyclerView.
here are my codes, this is the parent fragment.
public class MarketFragment extends Fragment {
private String log = "abcpappaHomeFragment";
private Button loadMore ;
private ArrayList<ProductCategoryBean> productCategoryList=null;
private ProductCategoryService productCategoryService;
private RecyclerView.Adapter mAdapter;
private RecyclerView mRecyclerView;
private LinearLayoutManager mLayoutManager;
public MarketFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,Bundle savedInstanceState) {
productCategoryService = new ProductCategoryService();
productCategoryList =(ArrayList<ProductCategoryBean>)productCategoryService.getAllCategories();
View rootView = inflater.inflate(R.layout.market_fragment, container, false);
mRecyclerView = (RecyclerView)rootView.findViewById(R.id.market_recycle_list);
mRecyclerView.setHasFixedSize(true);
mLayoutManager = new LinearLayoutManager(getContext());
mRecyclerView.setLayoutManager(mLayoutManager);
mAdapter = new MarketRecyclerAdapter(getContext(),productCategoryList,this);
mRecyclerView.setAdapter(mAdapter);
return rootView;
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
}
@Override
public void onDetach() {
super.onDetach();
}
}
this is a layoutfile
<?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"
xmlns:tools="http://schemas.android.com/tools"
tools:context="bodhiinfo.abcpappa.activity.MarketFragment">>
<android.support.v7.widget.RecyclerView
android:id="@+id/market_recycle_list"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="4dp" />
adapter class for parent RecyclerView
public class MarketRecyclerAdapter extends RecyclerView.Adapter<MarketRecyclerAdapter.ViewHolder> {
private Context context;
private List<ProductCategoryBean> productCategoryList=null;
private List<ProductBean> productDetailList=null;
private RecyclerView.Adapter mAdapter;
public MarketFragment marketFragment;
public MarketRecyclerAdapter(Context context,List<ProductCategoryBean> productCategoryList,MarketFragment marketFragment){
this.context = context;
this.productCategoryList =(ArrayList<ProductCategoryBean>) productCategoryList;
this.marketFragment = marketFragment;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.market_fragment_row, parent, false);
ViewHolder viewHolder = new ViewHolder(v,context);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
ProductCategoryBean productCategoryBean =(ProductCategoryBean)productCategoryList.get(position);
viewHolder.product_category_name_id.setText(productCategoryBean.getUtxt_product_category());
ProductService productService = new ProductService();
productDetailList = (ArrayList<ProductBean>)productService.getProductDetailsByCategoryId(productCategoryBean.getPki_product_category_id()+"");
viewHolder.product_recycle_list.setHasFixedSize(false);
viewHolder.mLayoutManager = new ChildCustomLinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false);
viewHolder.product_recycle_list.setLayoutManager(viewHolder.mLayoutManager);
mAdapter = new MarketRowRecyclerAdapter(context,productDetailList);
viewHolder.product_recycle_list.setAdapter(mAdapter);
}
@Override
public int getItemCount() {
return productCategoryList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView product_category_name_id;
public RecyclerView product_recycle_list;
public ChildCustomLinearLayoutManager mLayoutManager;
public Context context;
public View view;
public ClipData.Item currentItem;
public ViewHolder(final View itemView,final Context context) {
super(itemView);
this.context = context;
product_category_name_id = (TextView)itemView.findViewById(R.id.product_category_name_id);
product_recycle_list =(RecyclerView)itemView.findViewById(R.id.product_recycle_list);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
}
}
RecyclerView Parent Adapter Location
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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"
android:orientation="vertical"
tools:context="bodhiinfo.abcpappa.activity.MarketFragment">
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<LinearLayout
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/market_heading_raw"
android:layout_marginTop="25dp">
<TextView
android:id="@+id/product_category_name_id"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/market_heading"
android:layout_weight="0.7"
android:layout_gravity="left"
android:gravity="left"/>
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="View More.."
android:layout_weight="0.3"
android:layout_gravity="right"
android:gravity="right"
/>
</LinearLayout>
<android.support.v7.widget.RecyclerView
android:id="@+id/product_recycle_list"
android:orientation="horizontal"
android:layout_width="wrap_content"
android:layout_height="wrap_content"/>
</LinearLayout>
</RelativeLayout>
RecyclerView child adapter
public class MarketRowRecyclerAdapter extends RecyclerView.Adapter<MarketRowRecyclerAdapter.ViewHolder> {
private List<ProductBean> productList;
private Context context;
MarketRowRecyclerAdapter(Context context,List<ProductBean> productList){
this.productList =(ArrayList<ProductBean>)productList;
this.context = context;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.market_product_image_view, parent, false);
ViewHolder viewHolder = new ViewHolder(v,context);
return viewHolder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int position) {
ProductBean productBean=(ProductBean)productList.get(position);
ImageCacheManager imageCacheManager= ImageCacheManager.INSTANCE;
ImageLoader imageLoader=imageCacheManager.getImageLoader();
viewHolder.market_product_image_id.setImageUrl("http://www.ps4home.com/wp-content/uploads/2013/10/Mad-Catz-F.R.E.Q.5-Headset-for-PC-and-Mac-Black.jpg", imageLoader);
viewHolder.product_text_id.setText(productBean.getTxt_product_name());
viewHolder.product_actual_price_id.setText("Rs :"+productBean.getTxt_product_actual_price());
viewHolder.product_actual_price_id.setPaintFlags(viewHolder.product_actual_price_id.getPaintFlags() | Paint.STRIKE_THRU_TEXT_FLAG);
viewHolder.product_app_price_id.setText("Rs :" + productBean.getTxt_product_price_in_app());
}
@Override
public int getItemCount() {
return productList.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView product_text_id;
public TextView product_actual_price_id;
public TextView product_app_price_id;
public NetworkImageView market_product_image_id;
public Context context;
public View view;
public ViewHolder(final View itemView,final Context context) {
super(itemView);
this.context = context;
product_text_id = (TextView)itemView.findViewById(R.id.product_text_id);
product_actual_price_id= (TextView)itemView.findViewById(R.id.product_actual_price_id);
product_app_price_id= (TextView)itemView.findViewById(R.id.product_app_price_id);
market_product_image_id = (NetworkImageView)itemView.findViewById(R.id.market_product_image_id);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
}
});
}
}
}
<?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:orientation="vertical"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:paddingRight="10dp"
android:paddingLeft="10dp"
tools:context="bodhiinfo.abcpappa.activity.MarketFragment">
<FrameLayout
android:id="@+id/market_product1_image_frame_id"
android:layout_width="150dp"
android:layout_height="150dp">
<com.android.volley.toolbox.NetworkImageView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/market_product_image_id"/>
<TextView
android:id="@+id/product_text_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@color/text_light"
android:layout_gravity="bottom"
android:text="@string/product_one"
android:background="@drawable/textbackgrounds"/>
</FrameLayout>
<TextView
android:id="@+id/product_actual_price_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textColor="@color/text_dark_black"
android:text="@string/product_one"
android:layout_below="@+id/market_product1_image_frame_id"/>
<TextView
android:id="@+id/product_app_price_id"
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/product_one"
android:textColor="@color/text_dark_black"
android:layout_below="@+id/product_actual_price_id"/>
</LinearLayout>
ChildCustomLinearLayoutManager - , pptang .
. - , , . .