web-dev-qa-db-ja.com

RecyclerViewがonCreateViewHolderまたはonBindViewを呼び出さない

エラーが発生せず、すべてのデータが有効なようです。何らかの理由で、ビューに関連するメソッドのいずれかが呼び出されています。次のことを確認しました。

  • getItemCount()は呼び出される唯一のアダプターメソッドであり、正の整数値を返します(これは皆さんが見ているエリアであることを知っています)

    • コンストラクターが呼び出されていますが、メンバー変数は有効です。

    • 親ビューは垂直のLinearLayoutです。スクロールビューなし、または独自のスクロールプロパティが表示されている他のビュー。

    • フラグメントビューを含むが作成され、画面に表示されます。

以下は、フラグメントに続いてアダプターが続く宣言です。これは完全に困惑しているので、どんな助けも感謝します。

SubMenuAdapter adapter = new SubMenuAdapter(getActivity(), mContentItems);
    recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
    recyclerView.setItemAnimator(new DefaultItemAnimator());
    recyclerView.setAdapter(adapter);
public class SubMenuAdapter extends RecyclerView.Adapter<SubMenuAdapter.ViewHolder> {
private static final String TAG = String.format("==> %S", SubMenuAdapter.class.getSimpleName());

private final List<ContentItem> mContentItems;
private Context mContext;

public SubMenuAdapter(Context context, List<ContentItem> contenItems) {
    Log.d(TAG, "Constructor called");
    mContentItems = contenItems;
    mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder called");
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.row_resource_efficiency, parent, false);
    return new ViewHolder(view);
}

@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    Log.d(TAG, "onBindViewHolder called");

    ContentItem item = mContentItems.get(position);
    holder.textName.setText(item.getName());
    FontSetter.setMyriadProRegular(mContext, holder.textName);
    Picasso.with(mContext).load("file://" + item.getPreviewImageDefault()).into(holder.imageIcon);
}

@Override
public int getItemCount() {
    Log.d(mContext, String.format("getItemCount: %d", mContentItems.size()));
    return mContentItems.size();
}

// ViewHolder
public static class ViewHolder extends RecyclerView.ViewHolder {

    TextView textName;
    ImageView imageIcon;

    public ViewHolder(View view) {
        super(view);
        textName = (TextView) view.findViewById(R.id.tv_resource_efficiency_option);
        imageIcon = (ImageView) view.findViewById(R.id.iv_resource_efficiency_icon);
    }
}
55
Conti

これは誰かを助けるかもしれない

最初の使用

recyclerView.setAdapter(adapter);

その後:

recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

したがって、次のようになります。

recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));

順序が逆になっています

83
Aerim

1時間以上も答えを追っています。

アダプタを設定する前に、この1つのライナーを呼び出すことを忘れないでください。

recyclerView.setLayoutManager(new LinearLayoutManager(this));

リサイクラビューにはデフォルトのレイアウトマネージャオプションが組み込まれていないため、プログラムで追加する必要があります。

お役に立てば幸いです。

34
ralphgabb

ビューがネストされたscrollviewの子ではないことを確認してください

たとえば、このコードは機能しません。

<Android.support.v4.widget.NestedScrollView
    Android:id="@+id/responder_scroll"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:background="@color/darkGray"
    Android:clipToPadding="false"
    app:layout_behavior="@string/appbar_scrolling_view_behavior">

    <FrameLayout
        Android:layout_width="match_parent"
        Android:layout_height="wrap_content">

        <Android.support.v7.widget.CardView
            Android:layout_width="match_parent"
            Android:layout_height="wrap_content"
            Android:layout_marginTop="24dp"
            app:cardElevation="@dimen/spacing_medium"
            app:cardUseCompatPadding="true">

            <RelativeLayout
                Android:layout_width="match_parent"
                Android:layout_height="wrap_content">

                <TextView
                    Android:id="@+id/responder_testimonial"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentTop="true"
                    Android:text="Testimonial"
                    Android:textSize="@dimen/general_font_size" />

                <TextView
                    Android:id="@+id/responder_counter_testimonial"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_toRightOf="@+id/responder_testimonial"
                    Android:text="170"
                    Android:textSize="@dimen/general_font_size_small" />

                <Button
                    Android:id="@+id/responder_btn_testimonial"
                    Android:layout_width="wrap_content"
                    Android:layout_height="wrap_content"
                    Android:layout_alignParentRight="true"
                    Android:layout_alignParentTop="true"
                    Android:text="Go" />

               <view
                    Android:id="@+id/responder_list_testimonial"
                    Android:layout_width="match_parent"
                    Android:layout_height="match_parent"
                    Android:layout_below="@+id/responder_testimonial"
                    class="Android.support.v7.widget.RecyclerView"/>
            </RelativeLayout>
        </Android.support.v7.widget.CardView>

    </FrameLayout>
</Android.support.v4.widget.NestedScrollView>

その後、私は使用し、

<Android.support.design.widget.CoordinatorLayout
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:fitsSystemWindows="true">

<view
    Android:id="@+id/responder_list_testimonial"
    Android:layout_width="match_parent"
    Android:layout_height="match_parent"
    Android:layout_below="@+id/responder_testimonial"
    class="Android.support.v7.widget.RecyclerView"/>
19
raditya gumay

これがだれにも役立つかどうかはわかりませんが、まったく同じ問題を抱えていました。私の問題は、フラグメント/クラスにもリサイクラアダプターにもありませんでした。問題は、アクションバーがmatch_parentフラグメントが置換されるFrameLayoutは、表示可能な場所を取得しませんでした。そのため、メソッドは呼び出されませんでした。

同じ問題に直面している人には、同様のシナリオが当てはまると思います。すべてのXMLファイルのすべての幅と高さが同じツリーにある可能性があることを再確認してください。これは、アダプターに問題がないようです。

11

ここに私の2ペニー。これをデバッグするのに3時間以上かかりました。

次の行を不注意に使用していないことを確認してください。

recyclerView.setHasFixedSize(true);

ビューのサイズが一定であることが確実な場合にのみ、固定サイズを設定します。そうでない場合、onCreateViewHolderおよびonBindViewメソッドはまったく呼び出されない可能性があります。

8

また、onCreateViewHolderまたはonBindViewメソッドが呼び出されず、getItemCountのみが呼び出されるという同じ問題に直面していました。したがって、wrap_contentまたは0dpに設定されたRecyclerViewの高さと重量に基本的に問題がありました。何らかの値に変更した後、問題を修正しました。

4
Vijay Pal

これはすでに古いですが、私の場合、ConstraintLayoutを使用しており、ビューが0dpそして、ビューは0dpであるため、アダプターはジョブを実行するために保存します。

高さと幅に問題がなく、RecyclerViewのサイズが正であることを確認してください。

3

Wrap_contentをリストの高さとアイテムリストの高さに設定すると、何も表示されず、recyclerView関数も呼び出されません。

2
Meriam

私の場合、setHasStableIds(true);を使用していました。一部のリストアイテムがgetItemID()で-1を返している間にアダプターで、RecyclerViewが等しいと考えていたと思います。

1
David

私はこのトピックが古いことを知っていますが、あなたが私と同じ学習者の間違いをした場合、あなたはこれが役に立つかもしれません。

私はRecyclerViewについていくつかのウェブサイトで勉強し、いくつかのコードをコピーして自分のコンテキストに適応させていたので、いくつかのメソッドがデータを呼び出し、いくつかがユーザーを呼び出していたことを除いて、同じことをするための異なる変数(ユーザーとデータなど)を作成しました。これは、他のコードとJavaの機能を理解しようとするとき(いつも私に起こります)にしようとするとき、簡単な間違いです。

コンソールのJavaコードのどこでもprintlnできるので、そのように簡単にデバッグできます。

幸運を!

1
bem22

アダプタで作業しているスレッドに注意してください。
私の場合、問題は、データがサービスから取得されたときにアクティビティからnotifyDataSetChanged()を呼び出すことでした。実際、メソッドはバックグラウンドスレッドから呼び出していました。しかし、アプリはクラッシュせず、Lo​​gcatには何もありませんでした(!)。
だから私はUIスレッドでnotifyDataSetChanged()と呼ばれ、問題は解決しました。

runOnUiThread(new Runnable() {
    @Override
    public void run() {
        adapter.notifyDataSetChanged();
    }
});
1
Seyyed

FirebaseListAdapterを実装するときは、次の点に注意して正しくセットアップする必要があります。

  1. Xmlのrecyclerviewにすべての属性が正しいかどうかを確認してください。たとえば、高さと幅に折り返しコンテンツを使用しないでください。
  2. LayoutManagerが設定されており、setHasFixedSize()が処理されているかどうかを確認してください。
  3. Firebaseの子属性と一致するようにPOJOクラス変数を作成します。
  4. FirebaseRecyclerOptionsが設定されています。
  5. FirebaseRecyclerAdapterのonCreateViewHolder()およびonBindViewHolderがあります。
  6. ライフサイクルイベントが処理されます。

注-recyclerviewの高さとしてwrap_contentを使用することは、誰でもできる最も簡単な間違いの1つです。最初に確認してください。

1

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

回答へのリンク

0

最近この問題に遭遇しましたが、明らかに多くの原因が考えられます。これらのオプションのいずれかまたは組み合わせを試してください、あなたのためにどれが機能するかを見てください:)

1。レイアウトマネージャー
以下のように、リサイクラービューにレイアウトマネージャーを設定してください。

// create a layout manager
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(my_context);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);

// get recycler view
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recycler_id);
// set
recyclerView.setLayoutManager(linearLayoutManager);

2。固定サイズ
リサイクラービューのサイズが固定されているかどうかを確認してください

// set fixed size
recyclerView.setHasFixedSize(true); // or false depending on implementation

。XML
ScrollViewとRelativeLayoutの組み合わせなどの混乱を引き起こす可能性のあるレイアウトで、リサイクラがネストされていないことを確認してください。問題を解決するかどうかを簡単に確認してください

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:Android="http://schemas.Android.com/apk/res/Android"
xmlns:tools="http://schemas.Android.com/tools"
Android:layout_width="match_parent"
Android:layout_height="match_parent"
Android:orientation="vertical">

<Android.support.v7.widget.RecyclerView
Android:id="@+id/thread_list"
Android:layout_width="match_parent"
Android:layout_height="match_parent" />
</LinearLayout>
0
Jonathan Kibet

私の場合、Fragmentの中にRecyclerViewがあり、ViewPagerがありました。 FragmentStatePagerAdapterのコンストラクタに_Fragment.getChildFragmentManager_の代わりにFragment.getFragmentManager()を使用したため、問題が発生しました。

P.S。 Layout Inspectorを使用すると、この種の問題をデバッグする際に非常に役立ちます。

0
Daniil

OnCreateViewHolderもonBindViewHolderも呼び出されないという同じ問題がありました。 onCreateViewHolderメソッドを変更して、parent.getContext()を実行する代わりにコンストラクタで参照を保存したContextを使用するように修正する必要があります。

public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    Log.d(TAG, "onCreateViewHolder called");
    View view = LayoutInflater.from(mContext).inflate(R.layout.row_resource_efficiency, parent, false);
    return new ViewHolder(view);
0
dpspae03

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

0
Siamak Ferdos