Внутренний адаптер RecyclerView невидим при обновлении - PullRequest
0 голосов
/ 12 ноября 2018

Вещи, которые невидимы внутри RV, кажутся общей проблемой, но я провел массу поисков и не могу понять, в чем дело.

У меня есть фрагмент, который содержит RecyclerView адаптеров. Внутри каждого адаптера есть другой RecyclerView, который отображает теги или категории (адаптеры).

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

До обновления

После обновления

Фрагмент верхнего уровня:

public class AdminReportCardsFragment extends Fragment {
RecyclerView rv;
AdminReportCardAdapter adapter;
SwipeRefreshLayout swipeContainer;

//Filter Option Data
private List<String> newCategories;

public AdminReportCardsFragment(){

}

@Override
public View onCreateView(@NonNull LayoutInflater flater, ViewGroup tainer, Bundle savedInstanceState){
    View v = flater.inflate(R.layout.fragment_admin_reportcards, tainer, false);

    adapter = new AdminReportCardAdapter(getContext());

    rv = v.findViewById(R.id.admin_reports_rv);

    adapter.updateReports(Client.reportMap.values());

    rv.setAdapter(adapter);
    LinearLayoutManager llm = new LinearLayoutManager(getContext());
    llm.setOrientation(LinearLayoutManager.VERTICAL);
    rv.setLayoutManager(llm);

    swipeContainer = v.findViewById(R.id.admin_reports_sr);
    swipeContainer.setOnRefreshListener(this::actionSwipeRefresh);

    return v;
}

public void refreshReports() {
    //network stuff, callback is this line
        adapter.updateReports(Client.reportMap.values());
}

private void actionSwipeRefresh() {
    swipeContainer.setRefreshing(true);
    {
        refreshReports();
    }
    if(swipeContainer.isRefreshing())
        swipeContainer.setRefreshing(false);
}

Адаптер для верхнего уровня RV:

public class AdminReportCardAdapter extends RecyclerView.Adapter<AdminReportCardAdapter.ReportViewHolder>{
Context ctx;
List<Report> data;

public AdminReportCardAdapter(Context c){
    ctx = c;
    data = new ArrayList<>();
}

public void updateReports(Collection<Report> c){
    data.clear();
    data.addAll(c);
    notifyDataSetChanged();
}

@NonNull
@Override
public AdminReportCardAdapter.ReportViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(ctx).inflate(R.layout.adapter_reportcard, parent, false);
    ReportViewHolder vh = new ReportViewHolder(v);
    LinearLayoutManager llm = new LinearLayoutManager(ctx);
    llm.setOrientation(LinearLayoutManager.HORIZONTAL);
    vh.catAdapter = new CategoryTagAdapter(false);
    vh.rv.setAdapter(vh.catAdapter);
    vh.rv.setLayoutManager(llm);

    return vh;
}

@Override
public void onBindViewHolder(@NonNull ReportViewHolder holder, int position) {
    Report r = data.get(position);
    holder.tvReportID.setText(r.reportId);
    holder.tvStatus.setText(r.status);
    holder.tvSubmitted.setText(Util.formatTimestamp(r.creationTimestamp));

    holder.catAdapter.updateCategories(r.categories);

    holder.cardContainer.setOnClickListener(v -> {
        Client.activeReport = data.get(holder.getAdapterPosition());
        ctx.startActivity(new Intent(ctx, AdminReportDetailsActivity.class));
    });
}

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

class ReportViewHolder extends RecyclerView.ViewHolder {
    RecyclerView rv;
    CategoryTagAdapter catAdapter;
    CardView cardContainer;
    TextView tvReportID, tvSubmitted, tvStatus;

    public ReportViewHolder(View v) {
        super(v);
        cardContainer = itemView.findViewById(R.id.reportcard_cv);
        tvReportID = itemView.findViewById(R.id.reportcard_alt_id);
        tvStatus = itemView.findViewById(R.id.reportcard_alt_status);
        tvSubmitted = itemView.findViewById(R.id.reportcard_alt_action);
        rv = itemView.findViewById(R.id.reportcard_rv_categories);
    }
}
}

Наконец, внутренний адаптер, который таинственным образом исчезает ...

public class CategoryTagAdapter extends RecyclerView.Adapter<CategoryTagAdapter.CategoryTagViewHolder>{
int layoutID;
private List<String> categoryList;

public CategoryTagAdapter(Boolean isTag){
    categoryList = new ArrayList<>();
    if(!isTag) layoutID = R.layout.adapter_category;
    else layoutID = R.layout.adapter_tag;
}

@NonNull
@Override
public CategoryTagViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(parent.getContext()).inflate(layoutID, parent, false);
    return new CategoryTagViewHolder(v, layoutID);
}

@Override
public void onBindViewHolder(@NonNull CategoryTagViewHolder holder, int position) {
    System.out.println("CAT BIND");
    holder.tv.setText(categoryList.get(position));
}

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

public void updateCategories(Collection<String> c){
    categoryList.clear();
    categoryList.addAll(c);
    notifyDataSetChanged();
}

class CategoryTagViewHolder extends RecyclerView.ViewHolder{
    TextView tv;

    public CategoryTagViewHolder(View itemView, int layoutID){
        super(itemView);
        if(layoutID == R.layout.adapter_category)
            tv = itemView.findViewById(R.id.adapter_alt_category);
        else
            tv = itemView.findViewById(R.id.adapter_alt_tag);
    }
}

Мои макеты отформатированы с помощью ConstraintLayout, и я заверил, что Recyclerview привязан. Должен ли вторичный адаптер быть переменной внутри его родителя? Или это в нужном месте в окне просмотра?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...