J'ai implémenté un FragmentStatePagerAdapter qui contient 6 fragments. Pour le premier fragment, j'ai défini 9 éléments dans array.xml. Il montre aussi 9 éléments mais je me suis rendu compte qu'il ne montre que les 5 premiers éléments corrects et ensuite il recommence à partir du premier élément.Comportement étrange de CustomAdapter
C'est le fragment:
public class FragArme extends ListFragment {
String[] exercise;
String[] muscles;
List<RowItem> rowItems;
View root;
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
root = inflater.inflate(R.layout.frag_list_video, container, false);
return root;
}
@Override
public void onActivityCreated(@Nullable Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
rowItems = new ArrayList<RowItem>();
exercise = getResources().getStringArray(R.array.arms);
muscles = getResources().getStringArray(R.array.arms_muscles);
for (int i = 0; i < exercise.length; i++) {
RowItem item = new RowItem(exercise[i], muscles[i]);
rowItems.add(item);
}
CustomAdapter adapter = new CustomAdapter(getActivity(), rowItems);
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
getActivity().setContentView(R.layout.act_video_view);
if (position == 0) {
VideoView myVideoView = (VideoView) getActivity().findViewById(R.id.myvideoview);
myVideoView.setVideoPath("android.resource://" + getActivity().getPackageName() + "/" + R.raw.test);
myVideoView.setMediaController(new MediaController(getActivity()));
myVideoView.requestFocus();
myVideoView.start();
}
}
}
Sur debug je vois que rowItems a les 9 articles corrects.
Le problème se produit sur mon CustomAdapter:
public class CustomAdapter extends BaseAdapter {
Context context;
List<RowItem> rowItems;
public CustomAdapter(Context context, List<RowItem> rowItems) {
this.context = context;
this.rowItems = rowItems;
}
@Override
public int getCount() {
return rowItems.size();
}
@Override
public Object getItem(int position) {
return rowItems.get(position);
}
@Override
public long getItemId(int position) {
return rowItems.indexOf(getItem(position));
}
/* private view holder class */
private class ViewHolder {
TextView exercise;
TextView muscles;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder = null;
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if (convertView == null) {
convertView = mInflater.inflate(R.layout.list_item_video, null);
holder = new ViewHolder();
holder.exercise = (TextView) convertView.findViewById(R.id.exercise);
holder.muscles = (TextView) convertView.findViewById(R.id.muscles);
RowItem row_pos = rowItems.get(position);
holder.exercise.setText(row_pos.getExercise());
holder.muscles.setText(row_pos.getMuscles());
convertView.setTag(holder);
} else {
holder = (ViewHolder) convertView.getTag();
}
return convertView;
}
}
Après la position 4, il commence à nouveau avec la position 0. Je ne comprends pas.
Avez-vous des idées?
Il est évident que c'est parce que le recyclage, vous faites essentiellement rien lorsque la vue est réutilisé ... Votre mise en œuvre si le modèle ViewHolder est erroné. – Selvin
Ok et ce que je fais mal ici? –
Vous ne faites rien quand convertView! = Null. S'il vous plaît, vérifiez l'un des exemples ViewHolder pour voir ce que vous devriez faire. – Selvin