2017-03-15 1 views
0

Ich versuche, die Liste der Elemente mit RecyclerView anzuzeigen. Das Problem ist, dass das Layout nur für das erste Element von List<BaseSensor> measurements angezeigt wird.RecyclerView.Adapter zeigt das Layout nur einmal an

Mein Adapter:

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

    private List<BaseSensor> measurements; 
    private Context context; 

    public MeasurementsAdapter(Context context, List<BaseSensor> measurements) { 
     this.context = context; 
     this.measurements = measurements; 
    } 

    @Override 
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     if (viewType == BaseSensor.DEVICE_TYPE_OXIMETER) { 
      View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.oximeter_list_item, parent, false); 
      return new OximeterView(rootView); 
     } 

     throw new RuntimeException("there is no type that matches the type " + viewType + " + make sure your using types correctly"); 
    } 

    @Override 
    public void onBindViewHolder(RecyclerView.ViewHolder viewHolder, int position) { 
     final BaseSensor item = measurements.get(position); 

     if (viewHolder instanceof OximeterView) { 
      OximeterView holder = (OximeterView) viewHolder; 
      holder.tvPulse.setText(String.valueOf(((OximeterSensor)item).getPulse())); 
     } 
    } 

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

    @Override 
    public int getItemViewType(int position) {   
     return BaseSensor.DEVICE_TYPE_OXIMETER; 
    } 

    public static class OximeterView extends RecyclerView.ViewHolder { 

     private TextView tvPulse; 

     public OximeterView(View rootView) { 
      super(rootView); 
      tvPulse = (TextView) rootView.findViewById(R.id.tvPulse); 
     } 
    } 
} 

onBindViewHolder Methode wird zwölfmal genannt, einmal für jedes Element von Messungen Liste jedoch tvPulse nur einmal mit dem Wert des ersten Elements meiner Liste angezeigt wird.

EDIT:

public class MeasurementsFragment extends BaseFragment { 

    private RecyclerView rvMeasurements; 
    private List<BaseSensor> measurements; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     View rootView = inflater.inflate(R.layout.fragment_measurements, container, false); 

     rvMeasurements = (RecyclerView) rootView.findViewById(R.id.rvMeasurements); 
     rvMeasurements.setLayoutManager(new LinearLayoutManager(getActivity())); 

     MeasurementsAT measurementsAT = new MeasurementsAT(); 
     measurementsAT.execute(); 

     return rootView; 
    } 

    private class MeasurementsAT extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected Void doInBackground(Void... params) { 

      DatabaseManager.createInstance(getActivity()); 
      measurements = DatabaseManager.getInstance().getAllMeasurements(); 

      return null; 
     } 

     @Override 
     protected void onPostExecute(Void bitmap) { 
      MeasurementsAdapter adapter = new MeasurementsAdapter(getActivity(), measurements); 
      rvMeasurements.setAdapter(adapter); 
     } 
    } 
} 
+0

Code der Recyclerview-Deklaration hinzufügen und Adapter festlegen –

+0

Versuchen Sie, eine Kontrastfarbe für die Zeile festzulegen, um festzustellen, ob die Ansicht angehängt ist. Log String.valueOf ((((OximeterSensor) item) .getPulse()) um nach null/leer zu suchen Auch der Kontext, den du an den Adapter übergibst wird nirgends verwendet - entferne ihn –

+0

Lösche 'return null' in doInBackground Es ist ungültig, es kann keinen Wert zurückgeben. Und wo 'measurements' Variable instanziiert wird? Sie haben wahrscheinlich nicht den gesamten Code kopiert. – miljon

Antwort

1

hatte ich das gleiche Problem geändert layout_height von 'match_parent' auf 'wrap_content'.

+0

Es hat funktioniert, vielen Dank! – user1852879

Verwandte Themen