簡體   English   中英

Android Recycler 返回零 output 盡管每行都達到了 onBindViewHolder()

[英]Android Recycler returns zero output despite reaching onBindViewHolder() for each row

我在我的應用程序的“教程”活動中放置了一個 RecyclerView,以列出來自我的應用程序擁有的 Room 數據庫的教程版本。 它托管在一個片段中,但這沒什么影響,因為在將它放在那里之前我遇到了同樣的問題。 RecyclerView 適配器到達 onBindViewHolder() 沒有任何問題,我從用於調試的 Log.w 中獲取日志,其中包含正確的數據。 問題似乎是 Layout 根本沒有膨脹,並且每行應該為 output 的按鈕從未出現。

適配器

public class VersionListAdapter extends RecyclerView.Adapter<VersionListAdapter.VersionViewHolder> {

    private List<Version> mVersionList;
    private final LayoutInflater mInflater;
    private final OnViewClickListener mListener;

    public VersionListAdapter(Context context)
    {
        this.mInflater = LayoutInflater.from(context);
        this.mVersionList = null;
        this.mListener = (OnViewClickListener) context;
    }

    @NonNull
    @Override
    public VersionViewHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {
        View row = mInflater.inflate(R.layout.row_versions_rv, viewGroup, false);
        return new VersionViewHolder(row, mListener);
    }

    @Override
    public void onBindViewHolder(@NonNull VersionViewHolder versionHolder, int rowNumber) {
        versionHolder.thisVersion = mVersionList.get(rowNumber);
        versionHolder.versionButton.setText((mVersionList.get(rowNumber).getText()));
        Log.w("THIS IS A TAG", mVersionList.get(rowNumber).getText()); //correct output
    }

    @Override
    public int getItemCount() {
        if(mVersionList!=null) return mVersionList.size();
        else return 0;
    }

    public void setElementList(List<Version> versions){
        this.mVersionList = versions;
        notifyDataSetChanged();
    }

    public static class VersionViewHolder extends RecyclerView.ViewHolder
            implements View.OnClickListener
    {
        OnViewClickListener listenerForThisRow;
        Version thisVersion;
        Button versionButton;

        public VersionViewHolder(
                @NonNull View viewForThisRow, OnViewClickListener listenerFromActivity)
        {
            super(viewForThisRow);
            this.listenerForThisRow = listenerFromActivity;
            versionButton = viewForThisRow.findViewById(R.id.version_button);
            viewForThisRow.setOnClickListener(this);
        }

        @Override
        public void onClick(View v){
            listenerForThisRow.onViewClick(thisVersion);
        }
    }

    public interface OnViewClickListener{
        void onViewClick(Version version);
    }
}

承載回收站視圖的片段 CLASS

public class VersionRecycler extends Fragment {

    protected RecyclerView mRecycler;
    protected VersionListAdapter mAdapter;

    public VersionRecycler(){
        super(R.layout.fragment_recycler_versions);
    }

    @Override
    public View onCreateView(
            @NotNull LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState
    ) {
        VersionViewModel mVersionViewModel = new VersionViewModel(requireActivity().getApplication());
        long tutorialId = requireArguments().getLong("tutorialId");
        View view = inflater.inflate(R.layout.fragment_recycler_versions, container, false);
        mAdapter = new VersionListAdapter(requireActivity());
        mRecycler = view.findViewById(R.id.versions_rv);
        mRecycler.setLayoutManager(new LinearLayoutManager(view.getContext(), LinearLayoutManager.VERTICAL, false));
        mVersionViewModel.getByTutorialId(tutorialId).observe(requireActivity(), versions->mAdapter.setElementList(versions));
        mRecycler.setAdapter(mAdapter);
        return view;
    }
}

片段是如何嵌入到活動中的

 <LinearLayout
        android:id="@+id/layout_versions_list"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:orientation="vertical"
        app:layout_constraintBottom_toBottomOf="parent"
        app:layout_constraintTop_toTopOf="parent"/>

片段布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".versionrecycler.VersionRecycler">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/versions_rv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"
        tools:listitem="@layout/row_versions_rv"/>

</androidx.constraintlayout.widget.ConstraintLayout>

RECYCLERVIEW ROW 的布局

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:baselineAligned="false">

    <Button
        android:id="@+id/version_button"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:textSize="40sp"
        app:layout_constraintTop_toTopOf="parent"/>

</androidx.constraintlayout.widget.ConstraintLayout>

您還應該添加 Start 和 Bottom 約束:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".versionrecycler.VersionRecycler">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/versions_rv"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        app:layout_constraintTop_toTopOf="parent"

        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintBottom_toBottomOf="parent"

        tools:listitem="@layout/row_versions_rv"/>

</androidx.constraintlayout.widget.ConstraintLayout>

您還可以將 RecyclerView layout_height 更改為 wrap_content 並僅添加 Start 約束

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM