7

Mam ten dziwny problem z moim adapterem, że żadne metody nie są wywoływane .. Konstruktor działa, zatrzymuje się, jeśli mam punkt przerwania, ale stamtąd, nic .. onCreateViewHolder nie jest wywoływany i nie ma onBindViewHolder i nawet getItemCount .. Próbowałem wszystkiego, co mogłem znaleźć w Internecie, ale nic nie działa, więc nie wiem co robić. Jakieś sugestie? Oto mój kod: Fragment:Metody adaptera RecyclerView nie nazywane

public class FragmentPackageDetails extends Fragment { 
    //other vars 
    RecyclerView rvPackageDetails; 
    DatabaseHandler database; 

    @Nullable 
    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
     Bundle args = getArguments(); 
     String temp = args.getString(KEY_TRACKER_CODE); 
     View v = inflater.inflate(R.layout.fragment_package_details_new, container, false); 

     return v; 
    } 

    @Override 
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { 
     super.onViewCreated(view, savedInstanceState); 
     rvPackageDetails = (RecyclerView) view.findViewById(R.id.rvPackageDetails); 
     rvPackageDetails.setLayoutManager(new LinearLayoutManager(getActivity())); 

     database = new DatabaseHandler(getActivity()); 
     selectedPackage = database.getPackage(trackerCode); 

     RecyclerView.Adapter adapter = new MyAdapter(selectedPackage.getRecords()); 
     rvPackageDetails.setAdapter(adapter); 
    } 
    //other methods in class 
} 

MyAdapter

public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { 
    private ArrayList<TrackingRecordCheckedOut> mDataset; 

    // Provide a reference to the views for each data item 
    // Complex data items may need more than one view per item, and 
    // you provide access to all the views for a data item in a view holder 
    public class ViewHolder extends RecyclerView.ViewHolder { 
     // each data item is just a string in this case 
     public TextView tvPackageDetailsRowDayOfWeek, tvPackageDetailsRowDayOfMonth, tvPackageDetailsRowNameOfMonth, 
       tvPackageDetailsRowDetailsTitle, tvPackageDetailsRowDetailsDescription, tvPackageDetailsRowDetialsTime; 

     public ViewHolder(View v) { 
      super(v); 
      tvPackageDetailsRowDayOfWeek = (TextView) v.findViewById(R.id.tvPackageDetailsRowDayOfWeek); 
      tvPackageDetailsRowDayOfMonth = (TextView) v.findViewById(R.id.tvPackageDetailsRowDayOfMonth); 
      tvPackageDetailsRowNameOfMonth = (TextView) v.findViewById(R.id.tvPackageDetailsRowNameOfMonth); 
      tvPackageDetailsRowDetailsTitle = (TextView) v.findViewById(R.id.tvPackageDetailsRowDetialsTime); 
      tvPackageDetailsRowDetailsDescription = (TextView) v.findViewById(R.id.tvPackageDetailsRowDetailsDescription); 
      tvPackageDetailsRowDetialsTime = (TextView) v.findViewById(R.id.tvPackageDetailsRowDetialsTime); 
     } 
    } 

    // Provide a suitable constructor (depends on the kind of dataset) 
    public MyAdapter(ArrayList<TrackingRecordCheckedOut> myDataset) { 
     mDataset = myDataset; 
    } 

    // Create new views (invoked by the layout manager) 
    @Override 
    public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     // create a new view 
     View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.recyclerview_list_item, parent, false); 
     // set the view's size, margins, paddings and layout parameters 
     ViewHolder vh = new ViewHolder(v); 
     return vh; 
    } 

    // Replace the contents of a view (invoked by the layout manager) 
    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     // - get element from your dataset at this position 
     // - replace the contents of the view with that element 
     TrackingRecordCheckedOut tr = mDataset.get(position); 
     holder.tvPackageDetailsRowDayOfWeek.setText(tr.getDayOfWeek()); 
     holder.tvPackageDetailsRowDayOfMonth.setText(tr.getDayOfWeek()); 
     holder.tvPackageDetailsRowNameOfMonth.setText(tr.getMonthOfYear()); 
     holder.tvPackageDetailsRowDetailsTitle.setText(tr.getTitle()); 
     holder.tvPackageDetailsRowDetailsDescription.setText(tr.getDetails()); 
     holder.tvPackageDetailsRowDetialsTime.setText(tr.getTimeOfDay()); 

    } 

    // Return the size of your dataset (invoked by the layout manager) 
    @Override 
    public int getItemCount() { 
     return mDataset.size(); 
    } 

} 

Fragment Układ:

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

    <android.support.v7.widget.RecyclerView 
     android:id="@+id/rvPackageDetails" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" /> 

</LinearLayout> 

RecyclerView Układ Row:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/llPackageDetailsRecyclerViewRow" 
    android:layout_width="match_parent" 
    android:layout_height="96dip" 
    android:orientation="horizontal" 
    android:weightSum="100"> 

    <LinearLayout 
     android:layout_width="0dip" 
     android:layout_height="match_parent" 
     android:layout_weight="20" 
     android:orientation="vertical" 
     android:weightSum="10"> 


     <TextView 
      android:id="@+id/tvPackageDetailsRowDayOfWeek" 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="3"/> 

     <TextView 
      android:id="@+id/tvPackageDetailsRowDayOfMonth" 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="4"/> 

     <TextView 
      android:id="@+id/tvPackageDetailsRowNameOfMonth" 
      android:layout_width="match_parent" 
      android:layout_height="0dip" 
      android:layout_weight="3"/> 


    </LinearLayout> 

    <LinearLayout 
     android:layout_width="0dip" 
     android:layout_height="match_parent" 
     android:layout_weight="80" 
     android:orientation="vertical"> 

     <TextView 
      android:id="@+id/tvPackageDetailsRowDetailsTitle" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="3"/> 

     <TextView 
      android:id="@+id/tvPackageDetailsRowDetailsDescription" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="4"/> 

     <TextView 
      android:id="@+id/tvPackageDetailsRowDetialsTime" 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_weight="3"/> 

    </LinearLayout> 

</LinearLayout> 
+0

Czy jesteś pewien, że 'selectedPackage. getRecords() 'nie zwraca pustej listy? – Rami

+0

Tak. Mam wewnątrz 4 elementy. – csanonymus

+0

Spróbuj przenieść kod wewnątrz * onViewCreated() * na * onCreateView() * (tworzenie instancji RecyclerView, tworzenie adaptera ...) – Rami

Odpowiedz

0

Spojrzałem na kodzie zrobić Naprawdę nie widzę problemu niestety. Jedną z rzeczy, która może być problematyczna, jest to, że w konstruktorze ViewHolder nazywasz super (v). Może być konieczne wywołanie super ((LinearLayout) v). To jednak nie ma znaczenia.

Powodzenia!

+0

Dzięki za obejrzenie tego. Próbowałem robić to, co sugerowałeś, ale to jest to samo .. – csanonymus

0

Miałem ten sam problem, gdy nie były wywoływane ani onCreateViewHolder, ani onBindViewHolder. Zapisywanie odniesienia do kontekstu konstruktora adaptera, a następnie zmieniając onCreateViewHolder metody użyć zapisanego odniesienie do kontekstu zamiast robić parent.getContext() powinien to naprawić:

private Context mContext; 

public MyAdapter(Context context, ArrayList<TrackingRecordCheckedOut> myDataset) { 
    mDataset = myDataset; 
    mContext = context; 
} 

public MyAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // create a new view using saved reference to Context (mContext) 
    View v = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_list_item, parent, false); 
    // set the view's size, margins, paddings and layout parameters 
    ViewHolder vh = new ViewHolder(v); 
    return vh; 
} 
Powiązane problemy