Nano Hash - криптовалюты, майнинг, программирование

Добавить элементы во вложенный список во вложенный вид recyclerview в recyclerview

У меня есть recyclerview, и в нем я пытаюсь добавить вложенный recyclerview, содержащий список. Вот что я пытаюсь сделать: Мой желаемый результат

Это самое близкое решение, которое я смог найти при переполнении стека, но они используют заголовки вместо выровненных по левому краю заголовков, которые охватывают все остальные вложенные взгляды. Как создать вложенный список во вложенном просмотре recyclerview в recyclerview?


  • Нам нужны два recyclerView и два адаптера, которые я называю внутренним и внешним. 16.02.2020
  • @SalarArabpour Звучит как хорошее решение. Как вы думаете, мой подход к идее мог бы быть лучше? Я чувствую, что думаю об использовании слишком большого количества просмотров переработчиков, чтобы получить то, что я хочу. Я только пытаюсь создать динамический список элементов в основном списке фиксированных элементов. 16.02.2020
  • Я могу заверить вас, что делать это с двумя recyclerviews — лучший вариант. Я отправлю вам пример кода завтра, когда я получу доступ к своему ноутбуку! 16.02.2020
  • @SalarArabpour, ты невероятный! 16.02.2020

Ответы:


1

Нам нужны два RecyclerView и два адаптера, которые я называю внутренним и внешним. Внутри ViewHolder внешнего адаптера поместите innerRecyclerView, а внутри onBindViewHolder внешнего адаптера установите адаптер для innerRecyclerView. Я недавно разработал тестовый проект, подобный этому.

вот внешний адаптер

public class MainAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private Context context;
private List<Category> categories;
private List<Ads> ads_list;
private List<Products> productsList;
private int count;
private int width;

public MainAdapter(Context context, List<Category> categories, List<Ads> ads_list,List<Products> productsList,int width) {
    this.context = context;
    this.categories = categories;
    this.ads_list = ads_list;
    this.productsList=productsList;
    this.width=width;
    //Helper.logDebug("main__adapter",String.valueOf(categories.size()));
    //Helper.logDebug("main_adapter","haminjoori");
}

private class ViewHolder extends RecyclerView.ViewHolder{
    private RecyclerView recyclerView;
    private TextView tv_type,ad_tv_image_address;
    private ImageView iv_ad;

    public ViewHolder(@NonNull View itemView) {
        super(itemView);

        recyclerView=itemView.findViewById(R.id.recyclerview_horizental);
        recyclerView.setNestedScrollingEnabled(false);
        tv_type=itemView.findViewById(R.id.tv_type);
        iv_ad=itemView.findViewById(R.id.iv_ad);
        ad_tv_image_address=itemView.findViewById(R.id.ad_image_address);
        //Helper.logDebug("main_adapter","haminjoori");
    }
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view= LayoutInflater.from(context).inflate(R.layout.recycler_layout,viewGroup,false);
    //Helper.logDebug("main_adapter","haminjoori");
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    ViewHolder holder= (ViewHolder) viewHolder;
    try {
        String banner_url=ads_list.get(i).getImage();
        holder.ad_tv_image_address.setText(banner_url);
        Picasso.get().load(context.getString(R.string.base_url_banner)+banner_url).into(holder.iv_ad);
    }catch (Exception ex){
        holder.ad_tv_image_address.setText("");
    }
    Helper.logDebug("main_adapter",holder.ad_tv_image_address.getText().toString());
    holder.tv_type.setText(categories.get(i).getName());
    SecondAdapter secondAdapter=new SecondAdapter(categories.get(i).getProducts(),context,width);
    LinearLayoutManager layoutManager=new LinearLayoutManager(context,LinearLayoutManager.HORIZONTAL,false);

    holder.recyclerView.setLayoutManager(layoutManager);
    holder.recyclerView.setAdapter(secondAdapter);



}

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

а вот и внутренний адаптер

public class SecondAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

private Context context;
private int count;
private List<Products> productsList;
private List<Category> categories;
private int width;

public SecondAdapter(List<Products> productsList, Context context,int width) {
    this.productsList = productsList;
    this.context = context;
    this.width=width;
}

private class ViewHolder extends RecyclerView.ViewHolder {
    private TextView market_price,our_price,name,unit,min_amount,image;
    private ImageView imagee;
    public ViewHolder(@NonNull View itemView) {
        super(itemView);
        itemView.getLayoutParams().width=width/2;


        market_price=itemView.findViewById(R.id.product_market_price);
        our_price=itemView.findViewById(R.id.product_our_price);
        name=itemView.findViewById(R.id.fruit_name);
        unit=itemView.findViewById(R.id.fruit_unit);
        image=itemView.findViewById(R.id.product_image_url);
        imagee=itemView.findViewById(R.id.iv_rec);
        min_amount=itemView.findViewById(R.id.product_min_amount);

        Log.d("second_adapter","haminjoori");
    }
}

@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
    View view= LayoutInflater.from(context).inflate(R.layout.recycler2_layout,viewGroup,false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int i) {
    ViewHolder holder= (ViewHolder) viewHolder;
    Helper.logDebug("second_adapter","haminjori");

    holder.name.setText(productsList.get(i).getName());
    holder.unit.setText(productsList.get(i).getUnit());
    holder.market_price.setText(String.valueOf(productsList.get(i).getMarketPrice()));
    holder.our_price.setText(String.valueOf(productsList.get(i).getOurPrice()));
    Helper.logDebug("secondAdapter",productsList.get(i).getImage());
    String address=productsList.get(i).getImage();
    address=address.substring(6);
    holder.image.setText(address);
    String full_address=context.getString(R.string.base_url_image)+address;
    Helper.logDebug("secondAdapter",full_address);
    Picasso.get().load(full_address).into(holder.imagee);
    holder.min_amount.setText(String.valueOf(productsList.get(i).getMin_amount()));
}

@Override
public int getItemCount() {

    Helper.logDebug("second_adapter",String.valueOf(productsList.size()));
    return productsList.size();
}
}

адаптер внешнего представления xml

<?xml version="1.0" encoding="UTF-8"?>
<RelativeLayout xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools"         
android:layout_height="wrap_content" android:layout_width="match_parent" 
xmlns:android="http://schemas.android.com/apk/res/android">

  <TextView android:layout_height="wrap_content" 
  android:layout_width="wrap_content" android:text="نوع میوه" 
  android:layout_marginBottom="4dp" android:layout_marginTop="4dp" 
  android:layout_centerHorizontal="true" style="@style/main_titles" 
  android:id="@+id/tv_type"/>

  <ImageView android:layout_height="wrap_content" 
  android:layout_width="wrap_content" 
  android:src="@drawable/ic_keyboard_arrow_right_black_24dp" 
  android:layout_alignParentRight="true"/>

  <android.support.v7.widget.RecyclerView 
  android:layout_height="wrap_content" android:layout_width="match_parent" 
  android:id="@+id/recyclerview_horizental" 
  android:layout_below="@id/tv_type" 
  app:layoutManager="android.support.v7.widget.LinearLayoutManager" 
  android:orientation="horizontal" 
  tools:listitem="@layout/recycler2_layout"/>

  <TextView android:layout_height="wrap_content" 
  android:layout_width="wrap_content" android:id="@+id/ad_image_address" 
  android:visibility="gone"/>

  <ImageView android:layout_height="80dp" android:layout_width="match_parent" 
  android:id="@+id/iv_ad" 
  android:layout_below="@id/recyclerview_horizental"/>

  </RelativeLayout>

адаптер внутреннего представления XML

<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout android:orientation="horizontal" 
android:layout_height="wrap_content" android:layout_width="match_parent" 
xmlns:android="http://schemas.android.com/apk/res/android">
<RelativeLayout android:layout_height="wrap_content" 
android:layout_width="0dp" android:layout_weight="1" 
android:id="@+id/rel_layout">

<ImageView android:layout_height="200dp" android:layout_width="match_parent" 
android:id="@+id/iv_rec"/>

<TextView android:layout_height="wrap_content" 
android:layout_width="wrap_content" android:id="@+id/fruit_name" 
android:textColor="@color/semi_black" android:textSize="14sp" 
android:layout_marginRight="8dp" android:layout_below="@id/iv_rec" 
android:layout_alignParentRight="true" android:text="نام میوه"/>

<TextView android:layout_height="wrap_content" 
android:layout_width="wrap_content" android:id="@+id/fruit_unit" 
android:textColor="@color/black_white" android:textSize="12sp" 
android:layout_below="@id/iv_rec" android:text="واحد" 
android:layout_alignParentLeft="true" android:layout_marginLeft="8dp"/>

<TextView android:layout_height="wrap_content" 
android:layout_width="wrap_content" android:id="@+id/product_market_price" 
android:textColor="@color/semi_black" android:textSize="12sp" 
android:layout_below="@id/fruit_unit" android:text="قیمت مارکت" 
android:layout_alignParentLeft="true" android:layout_marginLeft="8dp"/>

<TextView android:layout_height="wrap_content" 
android:layout_width="wrap_content" android:id="@+id/product_our_price" 
android:textColor="@color/semi_black" android:textSize="12sp" 
android:layout_below="@id/product_market_price" android:text="قیمت ما" 
android:layout_alignParentLeft="true" android:layout_marginLeft="8dp"/>

<TextView android:layout_height="wrap_content" 
android:layout_width="wrap_content" android:id="@+id/product_min_amount" 
android:textColor="@color/semi_black" android:textSize="12sp" 
android:layout_below="@id/product_market_price" 
android:layout_alignParentLeft="true" android:layout_marginLeft="8dp" 
android:visibility="gone"/>

<TextView android:layout_height="wrap_content" 
android:layout_width="wrap_content" android:id="@+id/product_image_url" 
android:textColor="@color/semi_black" android:textSize="12sp" 
android:layout_below="@id/product_market_price" 
android:layout_alignParentLeft="true" android:layout_marginLeft="8dp" 
android:visibility="gone"/>

</RelativeLayout>

<RelativeLayout android:layout_height="wrap_content" 
android:layout_width="0dp" android:layout_weight="1" 
android:visibility="gone"> </RelativeLayout>

</LinearLayout>

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

введите здесь описание изображения

категории внешние RecyclerView, а фрукты внутренние RecyclerView

спросите меня, есть ли у вас проблемы с реализацией этого...

16.02.2020
  • Фантастический! У меня это работает на Android Studio. Только один вопрос: как сделать, чтобы категории оборачивали список продуктов слева, а не в заголовок? Мне удалось сделать внутренний recyclerview вертикальным, и теперь я пытаюсь центрировать заголовки категорий как по вертикали, так и по горизонтали слева от списка продуктов. 16.02.2020
  • Самый простой способ - обернуть заголовок TextView в RelativeLayout. TextView с атрибутом xml android:centerVertical=true 17.02.2020
  • Могу я увидеть ваши макеты xml? 17.02.2020
  • Я также добавил xml-макеты, но помните, что скриншот чем-то похож, а не совсем то, что представляет собой xml-код, я просто не смог собрать проект и нашел похожий скриншот с веб-сайта этого клиента. 17.02.2020
  • Благодарю вас! Я отметил ваше решение как ответ. Только один последний вопрос: как мне редактировать данные во внутреннем адаптере через внешний адаптер? Например, когда я нажимаю на манго, я хочу, чтобы видимость манго была GONE. Как я могу это сделать? Спасибо за ваше время!! 18.02.2020
  • спасибо, хлеб, вы можете сделать это одним щелчком внутреннего адаптера. посмотрите на этот пример...holder.btnAction.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View view) { list.remove(position ); notifyDataSetChanged(); } }); 18.02.2020
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..