Search code examples
androidandroid-layoutandroid-fragmentsandroid-recyclerview

Android RecyclerView Scroll not working after Layout edit


I am trying to implement a horizontal scrolling RecyclerView inside an another RecyclerView which means parent RecyclerView(vertical scroll) and child RecyclerView(Horizontal scroll) inside parent RecyclerView. I referred couple of questions regarding this requirement and found a better solution from this question How to have a ListView/RecyclerView inside a parent RecyclerView? and implemented successfully. After the child adapter's layout file edit the child RecyclerView's scrolling disabled.

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() {
    // Required empty public constructor
}

@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 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;
// private marketList


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) {

        }
    });
}
}
}

layout of parent RecyclerView adapter

<?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">
    <!-- linear layout for market heading row-->
    <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>

child RecyclerView 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) {

            }
        });
    }
  }
  }

Child Adapter Layout file

<?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 is the same class that provided by pptang in above mentioned question. Actually I am newbie in android,If you ever crossover this kind of problem let me know the mistake that I have done . Thank you all.


Solution

  • RecyclerView sizes itself based on its child views if wrap_content and no explicit minimum height has been set. In your child RecyclerView you have to consider change as follows

    <android.support.v7.widget.RecyclerView
        android:id="@+id/product_recycle_list"
        android:orientation="horizontal"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    

    you are using horizontal recyclerView so set the

    this will works if you want to know more about this problem visit https://code.google.com/p/android/issues/detail?id=74772 it will help you.