7

Ho questo strano problema con il mio adattatore che non vengono chiamati metodi .. Il costruttore funziona, si ferma lì se ho un punto di interruzione ma da lì, niente .. onCreateViewHolder non viene chiamato e né onBindViewHolder e nemmeno getItemCount .. Ho provato tutto quello che ho trovato online ma non sembra funzionare niente, quindi non so cosa fare. Eventuali suggerimenti? Ecco il mio codice: Fragment:Metodi di RecyclerView Adapter non chiamati

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

} 

Frammento Disposizione:

<?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 layout Fila:

<?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

Sei sicuro che 'selectedPackage. getRecords() 'non sta restituendo una lista vuota? – Rami

+0

Sì .. Al suo interno sono presenti 4 elementi – csanonymus

+0

Provare a spostare il codice all'interno * suViewCreated() * su * onCreateView() * (istanziazione di RecyclerView, creazione dell'adattatore ...) – Rami

risposta

0

ho guardato il codice fare non vedo davvero un problema purtroppo. Una cosa che potrebbe essere problematica è che nel costruttore ViewHolder si chiama super (v). Potrebbe essere necessario chiamare super ((LinearLayout) v). Questo potrebbe non fare la differenza però.

Buona fortuna!

+0

Grazie per averlo esaminato. Ho provato a fare quello che mi hai suggerito ma è lo stesso .. – csanonymus

0

Ho avuto questo stesso problema in cui né onCreateViewHolder o onBindViewHolder venivano chiamati. Salvataggio di un riferimento al contesto nel costruttore della vostra scheda, e quindi modificare il metodo onCreateViewHolder di utilizzare il riferimento salvato Contesto invece di fare parent.getContext() dovrebbe risolvere il problema:

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; 
} 
Problemi correlati