2016-09-10 9 views
0

Ich versuche RecyclerView, die in einem Fragment ist zu verwenden. Dies ist Fragment ist innerhalb der ViewPager geschachtelt.OnCreateViewHolder wird nie

public class UniversityDetail extends Fragment { 

RecyclerView universityDetailView; 

//need to set Adapter 

public static UniversityDetail newInstance(){ 
    return new UniversityDetail(); 
} 

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
    View view = inflater.inflate(R.layout.fragment_university_lsit,container,false); 
    universityDetailView = (RecyclerView)view; 
    setupViews(); 
    return view; 
} 


private void setupViews(){ 
    //set the adapter 
    UniversityDetailAdapter detailAdapter = new UniversityDetailAdapter(new ArrayList<UniversityDetails>()); 
    universityDetailView.addItemDecoration(new RecyclerListDecorater(getActivity())); 
    universityDetailView.setAdapter(detailAdapter); 
    universityDetailView.setLayoutManager(new LinearLayoutManager(getActivity())); 
    universityDetailView.setHasFixedSize(false); 
} 

public RecyclerView getRecyclerView(){ 
    return this.universityDetailView; 
    } 
} 

Dies ist das Fragment, das ich in der viewPager.It eine recyclerView von onCreateView sein will zurück.

<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 verwendet unter Adapter.

DetailHolder ist die Klasse erweitert ReyclerView.ViewHolder und seine Implementierung ist hier irrelevant.

Die Adapterliste wird von Handler und notifyDataSetChanged()

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()); 
      } 
     } 
    }; 
} 

Fragment wird in Aktivität erstellt ..

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(); 
} 

Implementierung von 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"); 

     } 
    } 

hier das Protokoll upated von adapter.getItemCount(); zurück 3; Das bedeutet, dass etwas hinzugefügt wird und OnCreateViewHolder soll aufgerufen werden, ist es aber nie.

Die komische Sache ist, dass ich einen anderen recyclerAdapter eingeführt habe, ist das selbeProject und sein Arbeiten vollkommen in Ordnung.

+0

Wenn es nie aufgerufen wird, dann machen Sie nie eine Instanz des Fragments. Wenn Sie denken, dass Sie sind, zeigen Sie bitte diesen Code. –

+0

Ich habe es in Aktivität erstellt und aufgerufen, wenn die Aktivität erstellt wird. –

+0

Also, Sie sagen, dass onCreateView nicht aufgerufen wird, noch können Sie den RecyclerView-Adapter bekommen und Daten hinzufügen ... Klingt wie es ist namens. Versuchen Sie, eine Log-Anweisung in dort –

Antwort

0

Dieses Problem wäre einfacher zu beantworten, wenn Sie zeigen könnten, wie die universityDetail zugewiesen wurde, aus welcher Klasse auch immer die Handler Verwendung enthält. Es ist auch nicht klar, wie message.obj in eine Liste umgewandelt werden kann.

Ich glaube, Sie verwenden dort eine andere Instanz des Fragments als die, die Sie aktualisieren möchten.


Also, wissen Sie, diese Linie

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

gut ist, weil Sie 3 in der Ausgabe sehen, wenn Sie tun, um diese

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

nun diese Zeilen wahrscheinlich das Problem sein könnte.

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

Erstens gibt es keine Methode, um addAllRecyclerView.Adapter. Also ich bin mir nicht sicher, wie das kompiliert wurde. Anyways ...

Versuchen Sie, übergreifende Referenzen auf ein Minimum zu beschränken. Hier geben wir nur die Methode an, die Details hinzuzufügen, anstatt den gesamten RecyclerView.

Dann für RecyclerViews, sollten Sie nur die Daten mitzuteilen, dass anstatt alle davon eingeführt wurde 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()); 
    } 
} 

verwenden und dann benutzen Sie einfach die Instanz Ihrer Fragment

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

Eine weitere Empfehlung wäre es, den korrekten generischen Typ für die Halterklasse zu verwenden, um unnötige Umwandlungen zu vermeiden.

public class UniversityDetailAdapter extends RecyclerView.Adapter<DetailHolder>