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);
}
}
}
Code der Recyclerview-Deklaration hinzufügen und Adapter festlegen –
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 –
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