2015-09-21 4 views
4

В моем приложении у меня есть ситуация, когда мне нужно создать горизонтальное RecyclerView в вертикальном RecyclerView. Их несколько строк, которые будут показывать случайные детали, а в некоторых из них будет отображаться горизонтальный RecyclerView.horizontal recyclerView with wrap_content в вертикальном recyclerView

Я установил высоту горизонтального RecyclerView в wrap_content, который не виден. Но когда я добавил к нему жестко-кодированную высоту, то видна RecyclerView. Я много искал эту проблему, но у меня не было никакого рабочего или убедительного решения.

Вот мой адаптер класса

public class HomeRVAdapter extends RecyclerView.Adapter<HomeRVAdapter.HomeViewHolder> { 
private ArrayList<LinkedHashMap<String, Object>> data; 
private Context ctx; 
private int selectedIndex; 

public HomeRVAdapter(Context ctx, ArrayList<LinkedHashMap<String, Object>> val) { 
    data = val; 
    this.ctx = ctx; 
    selectedIndex = -1; 
} 

@Override 
public HomeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    LayoutInflater inflater = ((Activity) ctx).getLayoutInflater(); 

    View view = inflater.inflate(R.layout.custom_home_recycler, null); 

    return new HomeViewHolder(view); 
} 

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

@Override 
public void onBindViewHolder(final HomeViewHolder holder, final int position) { 
    if (getItemCount() == position+1) { 
     holder.categoryLL.setVisibility(View.GONE); 
     holder.productLL.setVisibility(View.VISIBLE); 

     LinearLayoutManager manager = new LinearLayoutManager(ctx); 
     manager.setOrientation(LinearLayoutManager.HORIZONTAL); 

     ArrayList<SubCategoryDetails> list = new ArrayList<>(); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 
     list.add(new SubCategoryDetails()); 

     holder.subCatRV.setAdapter(new PromoProductAdapter(list, holder.subCatRV)); 
     holder.subCatRV.setLayoutManager(manager); 

    } else { 
     holder.categoryLL.setVisibility(View.VISIBLE); 
     holder.productLL.setVisibility(View.GONE); 

     if (selectedIndex == position) { 
      holder.subCatGrid.setVisibility(View.VISIBLE); 
      showGrid(holder); 
     } else { 
      holder.subCatGrid.setVisibility(View.GONE); 
     } 

     holder.catTR.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       if (selectedIndex == position) { 
        holder.subCatGrid.setVisibility(View.GONE); 
        selectedIndex = -1; 
       } else { 
        selectedIndex = position; 
        showGrid(holder); 
       } 
      } 
     }); 
    } 
} 

private void showGrid(HomeViewHolder holder) { 
    ArrayList<SubCategoryDetails> list = new ArrayList<>(); 
    list.add(new SubCategoryDetails()); 
    list.add(new SubCategoryDetails()); 
    list.add(new SubCategoryDetails()); 
    list.add(new SubCategoryDetails()); 
    list.add(new SubCategoryDetails()); 
    list.add(new SubCategoryDetails()); 
    list.add(new SubCategoryDetails()); 

    SubCategoryGridAdapter adapter = new SubCategoryGridAdapter(list); 

    holder.subCatGrid.setAdapter(adapter); 
    holder.subCatGrid.setVisibility(View.VISIBLE); 
} 

class HomeViewHolder extends RecyclerView.ViewHolder { 
    RecyclerView subCatRV; 
    TextView catTitleTV, productNameTV; 
    ImageView productIV; 
    NonScrollableGridView subCatGrid; 
    LinearLayout categoryLL, productLL; 
    TableRow catTR; 

    public HomeViewHolder(View view) { 
     super(view); 

     subCatRV = (RecyclerView) view.findViewById(R.id.subCatRV); 
     productNameTV = (TextView) view.findViewById(R.id.productNameTV); 

     catTitleTV = (TextView) view.findViewById(R.id.catTitleTV); 
     productIV = (ImageView) view.findViewById(R.id.productIV); 
     subCatGrid = (NonScrollableGridView) view.findViewById(R.id.subCatGrid); 
     categoryLL = (LinearLayout) view.findViewById(R.id.categoryLL); 
     productLL = (LinearLayout) view.findViewById(R.id.productLL); 
     catTR = (TableRow) view.findViewById(R.id.catTR); 
    } 
} 

class SubCategoryGridAdapter extends BaseAdapter { 
    ArrayList<SubCategoryDetails> subCatData; 

    public SubCategoryGridAdapter(ArrayList<SubCategoryDetails> subCatData){ 
     this.subCatData = subCatData; 
    } 

    @Override 
    public int getCount() { 
     return subCatData.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return null; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     if (convertView == null) { 
      convertView = ((Activity) ctx).getLayoutInflater().inflate(R.layout.custom_sub_cat_grid, null, true); 
     } 

     return convertView; 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; 
    } 
} 

class PromoProductAdapter extends RecyclerView.Adapter<PromoProductAdapter.PromoHolder> { 
    ArrayList<SubCategoryDetails> data; 
    RecyclerView horizontalRV; 

    public PromoProductAdapter(ArrayList<SubCategoryDetails> data, RecyclerView horizontalRV){ 
     this.data = data; 
     this.horizontalRV = horizontalRV; 
    } 

    @Override 
    public PromoHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater inflater = ((Activity) ctx).getLayoutInflater(); 

     View view = inflater.inflate(R.layout.custom_promoted_product, null); 

     if (horizontalRV != null) { 
      int height = view.getMeasuredHeight(); 
      horizontalRV.getLayoutParams().height = height; 
     } 

     return new PromoHolder(view); 
    } 

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

    @Override 
    public void onBindViewHolder(PromoHolder holder, int position) { 

    } 

    class PromoHolder extends RecyclerView.ViewHolder { 
     public PromoHolder(View view) { 
      super(view); 
     } 
    } 
} 

}

Пожалуйста, помогите мне получить эту проблему решить.

+1

Можете ли вы опубликовать код адаптера? –

+0

Обычно RecyclerView не будет 'wrap_content' height. –

+0

Я обновил свой вопрос –

ответ

1

Я решил это самостоятельно. Я использовал пользовательский LinearLayoutManager, который я нашел от link.

public class MyLinearLayoutManager extends LinearLayoutManager { 

public MyLinearLayoutManager(Context context) { 
    super(context); 
} 

private int[] mMeasuredDimension = new int[2]; 

@Override 
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state, 
         int widthSpec, int heightSpec) { 
    final int widthMode = View.MeasureSpec.getMode(widthSpec); 
    final int heightMode = View.MeasureSpec.getMode(heightSpec); 
    final int widthSize = View.MeasureSpec.getSize(widthSpec); 
    final int heightSize = View.MeasureSpec.getSize(heightSpec); 

    measureScrapChild(recycler, 0, 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
      View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED), 
      mMeasuredDimension); 

    int width = mMeasuredDimension[0]; 
    int height = mMeasuredDimension[1]; 

    switch (widthMode) { 
     case View.MeasureSpec.EXACTLY: 
     case View.MeasureSpec.AT_MOST: 
      width = widthSize; 
      break; 
     case View.MeasureSpec.UNSPECIFIED: 
    } 

    switch (heightMode) { 
     case View.MeasureSpec.EXACTLY: 
     case View.MeasureSpec.AT_MOST: 
      height = heightSize; 
      break; 
     case View.MeasureSpec.UNSPECIFIED: 
    } 

    setMeasuredDimension(width, height); 
} 

private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec, 
           int heightSpec, int[] measuredDimension) { 
    View view = recycler.getViewForPosition(position); 
    if (view != null) { 
     RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams(); 
     int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec, 
       getPaddingLeft() + getPaddingRight(), p.width); 
     int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec, 
       getPaddingTop() + getPaddingBottom(), p.height); 
     view.measure(childWidthSpec, childHeightSpec); 
     measuredDimension[0] = view.getMeasuredWidth(); 
     measuredDimension[1] = view.getMeasuredHeight(); 
     recycler.recycleView(view); 
    } 
}} 

Просто добавьте этот LinearLayoutManager в свой RecyclerView, вот и все.

Спасибо всем Cheers !!!

1

Более простым решением может быть сохранение жесткого кодирования по высоте (поскольку это горизонтальный вид, высота может оставаться фиксированной), а затем скрывать представление горизонтального ресайклера, если вход пуст.

if(list.size() == 0){ 
    horizontalRecyclerView.setVisibility(View.GONE); 
} 
Смежные вопросы