-1

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

enter image description here

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?

+0

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

+0

Ok et ce que je fais mal ici? –

+0

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

Répondre

2

Vous devez remplacer

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

à

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); 
    convertView.setTag(holder); 
    } else { 
    holder = (ViewHolder) convertView.getTag(); 
    } 


    RowItem row_pos = rowItems.get(position); 

    holder.exercise.setText(row_pos.getExercise()); 
    holder.muscles.setText(row_pos.getMuscles()); 
+0

Merci, ça marche. –