1. ホーム
  2. Android

Android RecyclerViewで「アダプターが接続されていません」と表示され、問題解析がスキップされる。

2022-02-13 11:31:53

私たちのプロジェクトでは、RecyclerViewをよく使います。今日の最適化コードで、ふと印刷された情報に含まれていることがわかりました。

--error RecyclerView: アダプタが接続されていません。レイアウトをスキップしています。

しかし、このせいでアプリがクラッシュすることはなく、プロジェクトがタイトだったため、この作品にはあまり注意を払わなかったのです。時間ができたので、このエラーメッセージを見つけました。クラッシュはしないものの、このエラーメッセージを見るのはとても不愉快なので、直したいと思っています。

情報を調べた結果、この現象の原因として2つの可能性があることがわかりました。

1. リサイクルビューのレイアウト(ランドスケープ、ポートレート、グリッドなど)が設定されていない。

   など、設定し忘れてはいけないと思います。

LinearLayoutManager mPerfectCourse = new LinearLayoutManager(mActivity);
mPerfectCourse.setOrientation(LinearLayoutManager.HORIZONTAL);// set the layout of the recyclerview to landscape
lvHotCourse.setLayoutManager(mPerfectCourse);

2. リサイクルビューのアダプタを設定するのが面倒くさいから

     などが主な理由のような気がします。

      onresume内部のデータを更新した後、cyclerviewのアダプタを設定し直すと、以下のような使い方ができますのでご覧ください。

 @Override
    public void onResume() {
        super.onResume();
       // get the data again each time
        getAPPHomePageInfo(mActivity);
    }
    /**
     * Home page user data - all data
     */
    private void getAPPHomePageInfo(final Context context) {
     
    /**
     * Here omit the network request of those operations, look directly at the business, the default got the dataset popularTeacherList
     */	
        initHotTeachers(popularTeacherList);           
    }
    /**
     * Initialize.
     */
    private void initHotTeachers(List<HotTeacher> mData) {
        XXRecycleViewAdapter mRecycleViewAdapter = new XXRecycleViewAdapter (mActivity, new RequestManager(), this);
        mRecycleViewAdapter .setData(mData);
        if (rvHotTeachers == null)
            return;
        rvHotTeachers.setAdapter(mRecycleViewAdapter );
        layoutHotTeachers.setVisibility(View.VISIBLE);
    }

上記の書き方だと、cyclerview.setAdapter(mRecycleViewAdapter )を複数回実行することになり、この記事で紹介した問題が発生することになります。

正しい使用方法です。

onCreate(Activity)またはonCreateView(fragement)でアダプタを初期化し、 cyclerview.setAdapter に渡します。

アダプタはデータを更新するためのメソッドを公開し、データの取得に成功したら、アダプタのメソッドを呼び出してリフレッシュを実行する必要があります。

    public void setData(List<MyCourseInfo> mData) {
        this.mData = mData;
        notifyDataSetChanged();//notify update
    }

この時点でコードを辿ってみると、No adapter attached;skipping promptはもはや存在しないことがわかり、すっきりしました。