13

私はついに数時間の研究を経て、公式のヘルプに相談しました。RecyclerView.onBindViewHolderは一度だけ呼び出されます

私は完全に機能するRecyclerView.AdapterとRecyclerView.ViewHoldersを持っています。しかし、私は理解していないいくつかの理由で、RecyclerView.Adapter.onBindViewHolderは適切に呼び出されません。ログメッセージに基づいて

private class AttendeeAdapter extends RecyclerView.Adapter<AttendeeHolder> { 
    /*FIELDS*/ 
    private List<Attendee> mAttendeeList; 

    /*CONSTRUCTORS*/ 
    public AttendeeAdapter(List<Attendee> attendees) { 
     mAttendeeList = attendees; 
     //Log.i(TAG, "AttendeeAdapter size: " + getItemCount()); 
    } 

(期待通りに項目がリストのサイズとしてカウント)、私はAttendeeAdapterが適切にインスタンス化されたと仮定します。

私はonBindViewHolder(VH、int)メソッドがListのサイズの何倍も呼び出されると思いますが、そうではありません。メソッドは1回だけ呼び出されます!

/*METHODS*/ 
    @Override 
    public AttendeeHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     LayoutInflater layoutInflater = LayoutInflater.from(getActivity()); 
     View itemView = layoutInflater.inflate(R.layout.list_attendee, parent, false); 
     return new AttendeeHolder(itemView); 
    } 

    @Override 
    public void onBindViewHolder(AttendeeHolder holder, int position) { 
     Attendee attendee = mAttendeeList.get(position); 
     holder.bindAttendee(attendee, position); 

     Log.i(TAG, "Binding ViewHolder #" + position); 
     /* Binding ViewHolder #0 and that's it */ 
    } 

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

マイAttendeeHolder(RecyclerView.ViewHolderを拡張する)は、次のようになり:

private class AttendeeHolder extends RecyclerView.ViewHolder { 
    /*FIELDS*/ 
    private EditText mAttendeeNameEditText; 
    private Attendee mAttendee; 

    /*CONSTRUCTOR*/ 
    public AttendeeHolder(View itemView) { 
     super(itemView); 
     mAttendeeNameEditText = (EditText) itemView.findViewById(R.id.edit_text_list_item); 
     mAmountEditTextList = new ArrayList<>(eventMaxCount); 
     } 

    /*METHODS*/ 
    public void bindAttendee(Attendee attendee, final int position) { 
     mAttendee = attendee; 
     String attendeeName = mAttendee.getName(); 

     // Set the name to the EditText if a name has already been set 
     if (attendeeName != null) { 
      mAttendeeNameEditText.setText(attendeeName); 
     } 
    } 
} 

List<Attendee> attendees = AttendeeLab.get().getAttendeeList(); 
    mAttendeeAdapter = new AttendeeAdapter(attendees); 
    mAmountRecyclerView.setAdapter(mAttendeeAdapter); 

としてメインコードで実装私は考える(コードが働くだろうと思います私は何も変更していない)しかし、gradleの依存関係が適切に設定されていない可能性があります。それは私がrecyclerview-v7:23.3.0をrecyclerview-v7:23.1.0に変更しようとしたところでした。

dependencies { 
compile fileTree(dir: 'libs', include: ['*.jar']) 
testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:23.3.0' 
compile 'com.android.support:design:23.3.0' 
compile 'com.android.support:support-v4:23.3.0' 
compile 'com.android.support:recyclerview-v7:23.1.2' 
} 

ご意見やご感想をお寄せください。私は今から数時間後に頭がおかしくなるといいと思う。

+0

わからない - しかし、どのようにそれはそれプライベートaccessandを持っているので、あなたは、あなたの 'AttendeeHolder'にアクセスくださいあなたの 'AttendeeAdapter'にはありません..?また、 'build.gradle'のサポートパッケージにも同じバージョンを使用してください。 – yennsarah

+0

ViewHolderとアダプタは、メインコード内の内部クラスにアクセス可能でした。 – SHAHM

+0

あなたは問題を解決しました!RecyclerViewsは、サポートパッケージ(v7:23.1.2)と同じ(古い)バージョンを使用して正しく動作しています。 Gradleの仕組みについてよく理解していませんが、そのように動作するはずですか?新しいrecyclerview-v7:23.3.0ライブラリでRecyclerViewsの使用を主張するとどうなりますか? – SHAHM

答えて

1

使用するすべてのサポートライブラリの同じバージョン:

また、 RecyclerView'com.android.support:design:23.3.0'パッケージを追加する必要があります
dependencies { 

compile fileTree(dir: 'libs', include: ['*.jar']) 

testCompile 'junit:junit:4.12' 
compile 'com.android.support:appcompat-v7:23.3.0' 
compile 'com.android.support:design:23.3.0' 
compile 'com.android.support:support-v4:23.3.0' 
compile 'com.android.support:recyclerview-v7:23.3.0' //<<< here 
} 

からGradle魔法は「これでビルドプロセスで行っているものは何でもclassorの上書き重複した "パッケージが原因で問題が発生している可能性があります。

+0

いいえ、動作しません。 onBindViewHolderは一度だけ呼び出されました。実際には、コードの最後の行はあなたが示唆したようなものでしたが、使用していたライブラリに固執する必要があると思って、投稿したときに変更しました。プロジェクトをクリーニングして再構築しても結果は変わりません。 – SHAHM

63

問題はあなたのコードにありません。 RecyclerViewの子項目のlayout_heightwrap_contentに設定してください。

+2

コードが正しく動作することに同意します。私は子項目の 'layout_height'属性をチェックし、それらがすべて' wrap_content'に設定されていることを発見しました。問題はライブラリに関するものだと確信しています。 – SHAHM

+0

実際にこのタイプの問題は私のプロジェクトでも発生し、私のために働いていました。 –

+0

偉大な答え。 +1 – developer1011

2

RecyclerViewサイクルでは、onBindViewHolderの動作に注意してください。 RecyclerView.ViewHolder位置0 itemView

android:layout_height="match_parent" 

が現在表示されている画面を占有しています。 ScrollとonBindViewHolderを起動する必要がありますが、getItemCountが適切に設定されていることを確認してください。

ソリューション:膨張itemViewとしてConstraintLayoutと

android:layout_height="wrap_content" 

解決策:これは何を意味している場合

<?xml version="1.0" encoding="utf-8"?>  
<android.support.constraint.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="wrap_content"><!-- IMPORTANT --> 
    <!-- ... --> 
</android.support.constraint.ConstraintLayout> 
関連する問題