2016-09-10 17 views
0

fragment内にあるrecyclerViewを使用しようとしています。これはviewPager内にネストされたフラグメントです。onCreateViewHolderは決して呼び出されません

これは、私がviewPagerの中にいたいフラグメントです。これは、onCreateViewからrecyclerViewを返します。

<android.support.v7.widget.RecyclerView xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:id="@+id/scroll" 
android:paddingBottom="8dp" 
android:paddingTop="?attr/actionBarSize" 
android:scrollbars="vertical"> 

fragment_university_lsit.xml

recyclerViewは、アダプタの下に使用しています。

public class UniversityDetailAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { 

private List<UniversityDetails> universityDetails; 
private static Map<String,String> admissionRecommendation; 

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    ((DetailHolder)holder).bind(universityDetails.get(position)); 
} 

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

public UniversityDetailAdapter(List<UniversityDetails> details){ 
    this.universityDetails = details; 
} 
@Override 
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent,int viewType){ 
    Log.d("CreateUniveristyDetail", "onCreateViewHolder: detail called"); 
    View itemView = LayoutInflater.from(parent.getContext()).inflate(R.layout.detail_fragment,parent,false); 
    return new DetailHolder(itemView); 
    } 
} 

DetailHolderは、ReyclerView.ViewHolderを拡張するクラスであり、その実装はここでは無関係です。

アダプタリストはハンドラとnotifyDataSetChanged(からupatedれる)

private void setup(){ 
    mHandler = new Handler(Looper.getMainLooper()){ 
     @Override 
     public void handleMessage(Message message){ 
      if(message.what == ConnectionHandler.DETAILMSG){ 
       Log.d("detail handle message", "handleMessage: Called"); 
       List<UniversityDetails> details = (List<UniversityDetails>)message.obj; 
       UniversityDetailAdapter adapter = (UniversityDetailAdapter)universityDetail.getRecyclerView().getAdapter(); 
       adapter.addAll(details); 
       adapter.notifyDataSetChanged(); 
       Log.d("size", "handleMessage: " + adapter.getItemCount()); 
      } 
     } 
    }; 
} 

断片が活動中に作成された...ここでDetailHolder

public class DetailHolder extends RecyclerView.ViewHolder{ 

    CardView admissionGeneral; 
    public View root; 

    public DetailHolder (View itemView){ 
     super(itemView); 
     root = itemView; 
     admissionGeneral = (CardView)root.findViewById(R.id.admission_general); 
    } 

    public void bind(UniversityDetails detail){ 

     Log.d("detail bind", "bind: binding to recyclerView"); 

     } 
    } 

private void setupNavigation(){ 
    ViewPagerAdapter pagerAdapter = new ViewPagerAdapter(getSupportFragmentManager()); 
    universityDetail = UniversityDetail.newInstance(); 
    pagerAdapter.addFragment(universityDetail); 
    mViewPager.setAdapter(pagerAdapter); 

    //setup the fragment transaction. 

    headerTab.setViewPager(mViewPager,0); 
    //no need to add to back stack 
    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction(); 
    transaction.add(R.id.view_pager,universityDetail); 
    transaction.commit(); 
} 

は、実装のログadapter.getItemCount(); 3を返します。 thatsは何かが追加されていることを意味し、onCreateViewHolderは呼び出されるはずですが、それは決してありません。

私は別のrecyclerAdapterを実装していますが、同じプロジェクトであり、その動作は完全です。

+0

これは決して呼び出されない場合、フラグメントのインスタンスを決して作成しません。あなたがそうだと思うなら、そのコードを示してください。 –

+0

アクティビティを作成しアクティビティが作成されたときに呼び出されました。 –

+0

したがって、onCreateViewは呼び出されていませんが、RecyclerViewアダプタを取得してデータを追加できます。と呼ばれる。そこにLogステートメントを追加してみてください。 –

答えて

0

この問題は、Handlerの使用を含むどのクラスからでもuniversityDetailがどのように割り当てられたかを示すことができれば、より簡単に答えることができます。

message.objがどのようにリストにキャストできるかも不明です。

私はあなたが更新したいものとは違った部分の断片を使用していると思います。


だから、あなたはあなたが今、この

Log.d("size", "handleMessage: " + adapter.getItemCount()); 

を行う際に、これらの行はおそらく問題になる可能性が出力に3を参照してくださいので、この行が

List<UniversityDetails> details = (List<UniversityDetails>)message.obj; 

良いです知っています。

UniversityDetailAdapter adapter = (UniversityDetailAdapter)universityDetail.getRecyclerView().getAdapter(); 
adapter.addAll(details); 
adapter.notifyDataSetChanged(); 

まず、RecyclerView.AdapterへのaddAll方法は存在しません。だから私はどのようにコンパイルされているのか分かりません。とにかく...

最小限のクラス間参照を維持してください。ここでは、RecyclerView全体ではなく詳細を追加するメソッドのみを公開しています。

その後、RecyclerViewsのために、あなたは自分のフラグメント

if(message.what == ConnectionHandler.DETAILMSG){ 
     Log.d("detail handle message", "handleMessage: Called"); 
     List<UniversityDetails> details = (List<UniversityDetails>) message.obj; 
     universityDetail.addDetails(details); 

別勧告のインスタンスを使用し、その後notifyItemRangeInserted

public class UniversityDetailFragment extends Fragment { 

    private RecyclerView universityDetailView; 
    private UniversityDetailAdapter detailAdapter; 

    private List<UniversityDetails> details = new ArrayList<UniversityDetails>(); 

    ... 

    public void setupViews() { 
     detailAdapter = new UniversityDetailAdapter(details); 
     // etc... 
    } 

    public void addDetails(List<UniversityDetails> details) { 
     int curSize = detailAdapter.getItemCount(); 
     this.details.addAll(details); 
     detailAdapter.notifyItemRangeInserted(curSize, details.size()); 
    } 
} 

を使用して、それがすべてではなく、挿入されたデータのみを通知しなければなりませんホルダークラスに正しいジェネリック型を使用して、不要なキャストを避けることです。

public class UniversityDetailAdapter extends RecyclerView.Adapter<DetailHolder> 
関連する問題