Вертикальный RecyclerView внутри Вертикальный RecyclerView - PullRequest
0 голосов
/ 01 февраля 2019

У меня есть просмотрщик заказов, в котором есть заказы.При нажатии заказа мне нужно отобразить продукты ниже заказа.Так что я использовал вложенный просмотрщик (вертикальный-вертикальный).Пример пользовательского интерфейса: ссылка

В первом элементе заказа в представлении повторного просмотра утилизируемых материалов представлен список продуктов ниже.Для остальных заказов на позиции заказа клика не отображается список продуктов ниже.Элемент заказа расширяется на ~ 10 dp с пустым пробелом.

Я знаю, что вложенность recylerview с такой же ориентацией очень плохая.Есть ли другой подход, который я должен использовать?или продолжите с тем же вложенным представлением переработчика.

Родительский адаптер

public class MyOrdersAdapter extends RecyclerView.Adapter<MyOrdersAdapter.MyViewHolder> {
private static final String TAG = MyOrdersAdapter.class.getSimpleName();
private List<RecentOrder> recentOrders;
private Context context;
private OrderHistoryInteractor orderHistoryInteractor;

public MyOrdersAdapter(@NonNull Context context, List<RecentOrder> recentOrders) {
    this.recentOrders = recentOrders;
    this.context = context;
    if (context instanceof OrderHistoryInteractor)
        orderHistoryInteractor = (OrderHistoryInteractor) context;
    else
        throw new ClassCastException("MyOrdersAdapter must implement OrderHistoryInteractor");
}

@Override
public MyOrdersAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_orders_item, parent, false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    RecentOrder recentOrder = recentOrders.get(position);
    try {
        //Glide.with(context).load(recentOrder.getProductDetails().getProductThumbImageUrl()).into(holder.orderImage);
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
    if (holder.productAdapter == null) {
        holder.orderedProductsList.setHasFixedSize(true);
        holder.productAdapter = new MyOrdersProductAdapter(context, recentOrders.get(holder.getAdapterPosition()).getOrderItems());
        holder.orderedProductsList.setAdapter(holder.productAdapter);
        holder.orderedProductsList.setLayoutManager(new LinearLayoutManager(context));
        holder.orderedProductsList.addItemDecoration(new VerticalSpaceItemDecoration(AndroidUtils.dpToPx(context, 8)));
    }
    holder.orderedProductsList.setVisibility(View.VISIBLE);
    holder.productName.setText(recentOrder.getOrderId());
    holder.orderQuantity.setText(recentOrder.getOrderId());
    holder.rootView.setOnClickListener(v -> {
        Log.d(TAG, "OnClickListener Works for toggling visibility!!");
        if ((holder.orderedProductsList.getVisibility() == View.VISIBLE))
            holder.orderedProductsList.setVisibility(View.GONE);
        else
            holder.orderedProductsList.setVisibility(View.VISIBLE);
    });
    //holder.orderAmount.setText(String.valueOf(recentOrder.getItemPrice()));
}

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

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public RecyclerView orderedProductsList;
    public MyOrdersProductAdapter productAdapter;
    public ImageView orderImage;
    public TextView productName, orderQuantity, orderAmount;
    public View rootView;

    public MyViewHolder(View view) {
        super(view);
        rootView = view;
        productName = view.findViewById(R.id.productName);
        orderImage = view.findViewById(R.id.orderImage);
        orderAmount = view.findViewById(R.id.orderAmount);
        orderQuantity = view.findViewById(R.id.orderQuantity);
        orderedProductsList = view.findViewById(R.id.orderedProductsList);
        view.setOnClickListener(this::onClick);
    }

    @Override
    public void onClick(View v) {

    }
}

}

Дочерний адаптер

public class MyOrdersProductAdapter extends RecyclerView.Adapter<MyOrdersProductAdapter.MyViewHolder> {
private List<RecentProduct> recentProducts;
private Context context;
private OrderHistoryInteractor orderHistoryInteractor;

public MyOrdersProductAdapter(@NonNull Context context, List<RecentProduct> recentProducts) {
    this.recentProducts = recentProducts;
    this.context = context;
    if (context instanceof OrderHistoryInteractor)
        orderHistoryInteractor = (OrderHistoryInteractor) context;
    else
        throw new ClassCastException("MyOrdersProductAdapter must implement OrderHistoryInteractor");
}

@Override
public MyOrdersProductAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.my_orders_products_item, parent, false);
    return new MyViewHolder(itemView);
}

@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
    RecentProduct recentProduct = recentProducts.get(position);
    try {
        Glide.with(context).load(recentProduct.getProduct().getProductThumbImageUrl()).into(holder.orderImage);
    } catch (NullPointerException e) {
        e.printStackTrace();
    }
    holder.productName.setText(recentProduct.getProduct().getProductName());
    holder.orderQuantity.setText(String.valueOf(recentProduct.getItemOrderQty()));
    holder.orderAmount.setText(String.valueOf(recentProduct.getItemPrice()));
}

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

public class MyViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    public ImageView orderImage;
    public TextView productName, orderQuantity, orderAmount;

    public MyViewHolder(View view) {
        super(view);
        productName = view.findViewById(R.id.productName);
        orderImage = view.findViewById(R.id.orderImage);
        orderAmount = view.findViewById(R.id.orderAmount);
        orderQuantity = view.findViewById(R.id.orderQuantity);
        view.setOnClickListener(this::onClick);
    }

    @Override
    public void onClick(View v) {
        //orderHistoryInteractor.onRecentOrderSelected(recentProducts.get(getAdapterPosition()));
    }
}

}

1 Ответ

0 голосов
/ 01 февраля 2019

Вложенный Recyclerview с той же ориентацией не хорош для производительности.Но посмотрите этот проект на Github .Он сделал это очень аккуратно.Надеюсь, это поможет !!

...