RecyclerviewがonCreateViewHolderを呼び出さない


150

私はRecyclerView呼び出すことはありませんonCreateViewHolderonBindViewHolderでもMenuViewHolderコンストラクタを、したがって、何もで表示されませんRecyclerView。デバッグ用にログを入れましたが、ログが表示されません。何が問題でしょうか?

私のアダプター:

public class MenuAdapter extends RecyclerView.Adapter<MenuAdapter.MenuViewHolder> {
private LayoutInflater inflater;
List<Menu> data = Collections.emptyList();

public MenuAdapter(Context context, List<Menu> data) {
    Log.i("DEBUG", "Constructor");
    inflater = LayoutInflater.from(context);
    Log.i("DEBUG MENU - CONSTRUCTOR", inflater.toString());
    this.data = data;
    for(Menu menu: this.data){
        Log.i("DEBUG MENU - CONSTRUCTOR", menu.menu);
    }
}

@Override
public MenuViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = inflater.inflate(R.layout.row_menu, parent, false);
    MenuViewHolder holder = new MenuViewHolder(view);
    return holder;
}

@Override
public void onBindViewHolder(MenuViewHolder holder, int position) {
    Log.i("DEBUG MENU", "onBindViewHolder");
    Menu current = data.get(position);
    holder.title.setText(current.menu);
}

@Override
public int getItemCount() {
    return 0;
}

class MenuViewHolder extends RecyclerView.ViewHolder {
    TextView title;
    ImageView icon;

    public MenuViewHolder(View itemView) {
        super(itemView);
        title = (TextView) itemView.findViewById(R.id.menuText);
    }
}

私のカスタム行XML:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="horizontal" android:layout_width="match_parent"
android:layout_height="match_parent">

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/menuText"
    android:text="Dummy Text"
    android:layout_gravity="center_vertical"
    android:textColor="#222"/>

そして私のフラグメント:

public NavigationFragment() {
    // Required empty public constructor
}

@Override
public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    mUserLearnedDrawer = Boolean.valueOf(readFromPreferences(getActivity(), KEY_USER_LEARNED_DRAWER, "false"));
    if (savedInstanceState != null) {
        mFromSavedInstaceState = true;
    }
}

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    // Inflate the layout for this fragment

    View view = inflater.inflate(R.layout.fragment_navigation, container, false);
    RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.drawer_list);
    MenuAdapter adapter = new MenuAdapter(getActivity(), getData());
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setAdapter(adapter);
    return view;
}

recyclerView.setAdapter(adapter);を設定する理由 2回?
Panayiotis Irakleous、2015年

この問題の別の原因は、アイテムのレイアウトを誤って親の高さに合わせるため、一度に1つのアイテムのみが表示されることです。
ジョーラップ

私の場合、これを助けます:
invoicesRecyclerView.setHasFixedSize

回答:


239

あなたのgetItemCount方法returns 0。したがってRecyclerView、ビューをインスタンス化しようとしないでください。何かを返すようにしgreater than 0ます。

例えば

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

25
ああまあ、今私はとても馬鹿げていると感じています!:facepalm:ありがとうございます!
Shinta S

3
getItemCountが他のすべてのコードよりもはるかに低く、表示されなかったため、これに1時間かかりました。:|
Joel

私はカスタムアダプターを持っていて、アイテム数をコレクションのサイズに設定するのを忘れていました
Dooie

3
私のアイテム数はまだ3は表示されていません、onBindまたはonCreateHolderにはデバッグポイントがありません...しかしgetItemCountに含まれています
aNdRO博士17

ちょっと、あなた!私もこれと格闘して、なぜ私のブレークポイントがヒットしないのかを理解していましたが、今ではわかります...笑!くそー!!!ありがとうございました!
ヴィンシー、

409

もう1つは、レイアウトマネージャーをRecyclerViewに設定することです。

recycler.setLayoutManager(new LinearLayoutManager(this));

2
私はこの回答に何度も戻ってきます...
finki


15

これは特定のケースには適用されません。しかし、これは他の誰かを助けるかもしれません。

この理由は、次のメソッドの不注意な使用である可能性があります

recyclerView.setHasFixedSize(true);

注意して使用しないと、onBindViewonCreateViewHolderがまったく呼び出されず、ログにエラーが記録されません。


12

レイアウトマネージャーをRecyclerView次のコードのように設定してください:

RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_view_right);
//set your recycler view adapter here
NavigationAdapter adapter = new NavigationAdapter(this, FragmentDrawer.getData());
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));

9

価値があるのは、アダプターが実際に初期化される前にリサイクラービューアダプターを設定したときです。解決策は、recyclerView.setAdapter(adapter)null以外のアダプタで呼び出されたことを確認することでした


9

私は本当に、本当に、これは誰かのいつかに役立ちます願っています。私はこの1つに行くことに1時間以上費やすだけです!

私はこれを持っていました:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = adapter
        }

私がこれを持っていたはずのとき:

projects_recycler_view.apply {
            this.layoutManager = linearLayoutManager
            this.adapter = projectAdapter
        }

私は愚かに自分のアダプターを呼び出したためadapter、適用ブロック内のリサイクラービューのアダプターによってシャドウされていました!アダプターの名前をprojectAdapterに変更して区別し、問題を解決しました!


6

またはTextViewでの高さを設定します。高さがの場合、は表示されません。custom.xmlRecyclerViewwrap-contentRecyclerView


これに多くの時間を費やしました。リサイクル業者ビューの高さはゼロでした。活動で使用されるとき、それはどういうわけかそれ自身を拡大しました。他のレイアウト内の断片で..それはしませんでした
Asif Shiraz

4

これは、私RecyclerViewがの中にいてScrollView、Android Support Library 23.0を使用していたときに発生しました。修正するには、Android Support Library 23.2に更新しました。

build.gradle:

dependencies {
    ...
    compile 'com.android.support:appcompat-v7:23.2.+'
    compile 'com.android.support:cardview-v7:23.2.+'
}


4

たぶんそれは誰かを助けるかもしれませんが、RecycleViewの可視性をGONEに設定した場合、アダプタメソッドはまったく呼び出されません...それを理解するのに少し時間がかかりました。


信じられないほど!!!!! ...そんなにタンク、、、
X-Black ...

3

android.support.constraint.ConstraintLayoutレイアウトリソースで使用していたため、同じ問題が発生しました。FrameLayout助けに変更。


解決策をありがとう。ビューの親が次のようになっていると、なぜこのように動作するのandroid.support.constraint.ConstraintLayoutでしょうか?
エイドリアンBuciuman 2018

2

他のオプションは、getを使用してこのリストobjetcを送信する場合です。たとえば、正しい参照があるかどうかを確認します。

private list<objetc> listObjetc;
//Incorrect
public void setListObjetcs(list<objetc> listObjetc){
  listObjetc = listObjetc;
}

//Correct
public void setListObjetcs(list<objetc> listObjetc){
  this.listObjetc = listObjetc;
}

2

この問題に何時間も苦労しました。フラグメントを使用していました。そして問題はを返しませんでしたview。以下は私のコードです:

ProductGridBinding binding = DataBindingUtil.inflate( inflater, R.layout.product_grid, container, false);



    mLinearLayoutManager = new LinearLayoutManager(getActivity());
    mLinearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

    binding.rvNumbers.setHasFixedSize(true);
    binding.rvNumbers.setLayoutManager(mLinearLayoutManager);
    binding.rvNumbers.setAdapter(adapter);


    View view = binding.getRoot();


    return view;

奇妙なコード。これらの変数とクラスは理解するのが難しいです。
CoolMind 2018

2

Androidデータバインディングライブラリを使用している場合は、私の回答を参照してください-recyclerviewのレイアウトを設定していることと、アイテム数が0より大きいことを確認してください

 @BindingAdapter({"entries", "layout"})
    public static void setEntries(RecyclerView view, ArrayList<LoginResponse.User> listOfUsers, int layoutId) {
        if (view.getAdapter() == null) {
            view.setLayoutManager(new LinearLayoutManager(view.getContext()));
            SingleLayoutAdapter adapter = new SingleLayoutAdapter(layoutId) {
                @Override
                protected Object getObjForPosition(int position) {

                    return listOfUsers.get(position);
                }

                @Override
                public int getItemCount() {
                    return listOfUsers.size();
                }
            };
            view.setAdapter(adapter);
        }
    }

ハッピーコーディング:-)


1

私の場合、RecyclerViewのIDを "recyclerView"に設定しました。このIDはすでにどこかで定義されているようです。これを別のIDに変更すると、アダプターからのメソッドが正しく呼び出されたためです。


1

カスタムアダプターを使用する場合は、ItemCountをコレクションのサイズに設定することを忘れないでください。


1

私の場合、リストのサイズは0で、onCreateViewHolderメソッドを呼び出していませんでした。空のリストの中央にメッセージをプレースホルダーとして表示する必要があったので、このようにして魅力的に機能しました。@Konstantin Burovの回答が役立ちました。

  @Override
public int getItemCount() {
    if (contactList.size() == 0) {
        return 1;
    } else {
        return contactList.size();
    }
}

これは本当に良い考えではありません。アダプターにデータを書き込むときは、空のメッセージの可視性を設定することをお勧めします。
1

1

私のencouterは、RecyclerView.adaptorのonBindViewHolder(holder、position)オーバーライドメソッドが呼び出されていませんでした。メソッドonCreateViewHolderが呼び出され、getItemCountが呼び出されました。Recyclerviewアダプターの仕様を読むと、onBindViewHolder(holder、position、Listペイロード)をオーバーライドした場合に優先的に呼び出されることがわかります。気をつけてください。


電話をかけない問題をどのように解決しましたonBindViewHolderか?
CoolMind 2018

1

wrap_contentをリストの高さおよびアイテムリストの高さとして配置した場合、何も表示されず、recyclerView関数は呼び出されません。アイテムの高さを修正するか、リストの高さにmatch_parentを設定します。それで問題は解決しました。


1

私の間違いは、フラグメントonCreateViewの誤ったビューを膨らませることでした。


1

あなたのxmlに行きます。そして、レイアウトを変更してコンテンツをラップします。1つの要素が次の要素を隠しているため、メソッドが機能していません!


1
StackOverflow @koala!へようこそ。こちらをご覧ください良い答えをここに書く方法stackoverflow.com/help/how-to-answer
Shashin Bhayani


0

私の場合、ActivityをViewModelとDataBindingを使用するように変更した後、setContentViewメソッド呼び出しをonCreateメソッドから削除するのを忘れていました。それを取り除くことで私の問題は解決しました。


0

私にとっては、setHasStableIds(true); メソッドが設定されました。それを削除すると動作します


しかし、この方法は、問題の最小限の再現可能な例には含まれていないようです。このヒントを削除すると問題が解決する場合は、おそらくビューホルダーまたは通知機能の実装にバグがあることを示しています。

0

recyclerView.setAdapter(adapter); 呼び出されたrecyclerViewリストは、メソッドを呼び出すことによって設定されます。


0

XMLKoltin/Javaコードが一致していることを確認してください。私の場合、ViewHolder私が書いてから問題がありました:

var txt: AppCompatTextView = itemView.findViewById(R.id.txt)

しかし、私のXMLコードは次のとおりです。

<TextView
        android:id="@+id/txt"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        .../>

私は前の行を次のように変更する必要がありました:

var txt: TextView = itemView.findViewById(R.id.txt)

さらに、私も削除する必要がありました:

recyclerView.setHasFixedSize(true);

これがあなたのお役に立てば幸いです:)


0

私の場合、notifyDataSetChanged()アダプターにリストを設定した後、呼び出しがありませんでした。

public void setUserList(List<UserList> userList) {
      this.userList = userList;
        notifyDataSetChanged();
}

0

私の場合、LinearLayoutで方向を設定するのに失敗しました。

向きの問題を追加した後、修正されました。

 android:orientation="vertical"

0

私の問題だったlayout_heightlayout_widthのRecyclerViewセットの0dp

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.