ExpandableRecyclerView как сформировать вложенный список

198
24 июля 2021, 00:40

При создании вложенного списка ExpandableRecyclerView у меня возникли проблемы.
Список будет содержать валютные пары бирж криптовалют. Для парсинга данных я использую библиотеку retrofit. Список будет выглядеть примерно так

В данном случай я парсил данные из сайтов (бирж) exmo.com и okex.com (Для наглядности я добавил данные вручную). Но, проблема в том, что я хочу парсить валютные пары из 40-50 бирж(сайтов) и в любой момент биржы могут добавить новую валютную пару. Если загружать в OnCreate все данные, то программа может зависать на 2-3 минуты. Я не хочу загружать все данные(хочу сэкономить трафик), я хочу, чтобы при событии setOnGroupExpandCollapseListener т,е когда сворачиваем конкретную группу загрузились валютные пары только этой группы (биржи). Как мне этого добиться??? После того как я присваиваю адаптер ресайклеру добавить что-то в группу или в подгруппу не получается. Я использую библиотеку https://github.com/thoughtbot/expandable-recycler-view/tree/master/expandablecheckrecyclerview/src/main/java/com/thoughtbot/expandablecheckrecyclerview

Мой код MainActivity

public class CryptoCurrencyExpandableListActivity extends AppCompatActivity {
    private MultiCheckGroupAdapter adapter;
    RecyclerView recyclerView;
    List<MultiCheckGroup> groupList = new ArrayList<>();
    List<Currency> addCurOKEx = new ArrayList<>();
    List<Currency> addCurExmo = new ArrayList<>();
    List<CurrencyOKEx> currencyList = new ArrayList<>();
    boolean thread = false;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_crypto_currency_expandable_list);
        recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        recyclerView.setLayoutManager(layoutManager);
        addCurExmo.add(new Currency("BTC-USD"));
        addCurExmo.add(new Currency("LTC-BTC"));
        addCurOKEx.add(new Currency("BTC-USD"));
        addCurOKEx.add(new Currency("ETH-TUSD"));
        groupList.add(new MultiCheckGroup("EXMO.com", addCurExmo));
        groupList.add(new MultiCheckGroup("OKEx.com", addCurOKEx));
        adapter = new MultiCheckGroupAdapter(groupList);
        recyclerView.setAdapter(adapter);
}

код Адаптера

package com.example.currencycalc;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.thoughtbot.expandablecheckrecyclerview.CheckableChildRecyclerViewAdapter;
import com.thoughtbot.expandablecheckrecyclerview.models.CheckedExpandableGroup;
import com.thoughtbot.expandablerecyclerview.models.ExpandableGroup;
import java.util.List;
public class MultiCheckGroupAdapter extends
        CheckableChildRecyclerViewAdapter<MultiCheckGroupViewHolder, MultiCheckCurrencyViewHolder> {
    public MultiCheckGroupAdapter(List<MultiCheckGroup> groups) {
        super(groups);
    }
    @Override
    public MultiCheckCurrencyViewHolder onCreateCheckChildViewHolder(ViewGroup parent, final int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.expandable_recycler_view_currency, parent, false);

        return new MultiCheckCurrencyViewHolder(view);
    }
    @Override
    public void onBindCheckChildViewHolder(MultiCheckCurrencyViewHolder holder, int position,
                                           CheckedExpandableGroup group, int childIndex) {
        final Currency artist = (Currency) group.getItems().get(childIndex);
        holder.setCurrencyName(artist.getName());
    }
    @Override
    public MultiCheckGroupViewHolder onCreateGroupViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.expandable_recycler_view_group, parent, false);
        return new MultiCheckGroupViewHolder(view);
    }
    @Override
    public void onBindGroupViewHolder(MultiCheckGroupViewHolder holder, int flatPosition,
                                      ExpandableGroup group) {
        holder.setGroupTitle(group);
    }
}
Answer 1

Почитайте про работу со списками, после добавления данных используйте notifyDataSetChanged(). Лучше для этих целей использовать DiffUtils, но это нужно вам будет после того как вы научитесь пользоваться списками и адаптером. Дальше, у вас есть список бирж, как я понимаю он нигде не хранится на внешнем источники, значит этот момент хардкодим, способов множество от хранения в строковых ресурсах, до БД путешествующей с вашим апп, зависит от целей и уровня извращённости. Данная библиотека содержит слушатель на открытие, закрытие списка (свернуть/развернуть):

adapter.setOnGroupExpandCollapseListener(new GroupExpandCollapseListener() {
@Override
public void onGroupExpanded(ExpandableGroup group) {
}
@Override
public void onGroupCollapsed(ExpandableGroup group) {
}

});

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

READ ALSO
Два разных параллельных потока в Activity разные по времени

Два разных параллельных потока в Activity разные по времени

уважаемые! В AsyncTask получаю JSON данные по REST с сервера, обрабатываю с помощью Jackson и отправляю это в ListView

188
Вычислить число размещений из n по m

Вычислить число размещений из n по m

Нужна помощь, кто чем может,нужно реализовать функцию, которая будет вычислять количество размещений из n по m , спасибо

152
Нужно очистить текстовый файл и записать после очистки новые данные

Нужно очистить текстовый файл и записать после очистки новые данные

Естьtxt файл, он должен с помощью кода очищаться, и после очищения в него нужно записать новую информацию

203
Ошибка при запуске JAVA приложения

Ошибка при запуске JAVA приложения

Пытаюсь запустить minecraft сервер на Debian 8, но при запуске возникает ошибка: pastebin

197