CustomAdapter 的奇怪行为

Strange behaviour of CustomAdapter

我实现了一个包含 6 个片段的 FragmentStatePagerAdapter。 对于第一个片段,我在 array.xml 中定义了 9 个元素。它还显示了 9 个元素,但我意识到它只显示了前 5 个元素是正确的,然后它又从第一个元素开始。

这是片段:

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

}

}

在调试时我看到 rowItems 有正确的 9 个项目。

我的 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;
}

}

在位置 4 之后它又从位置 0 开始。我不明白这个。

你有什么想法吗?

你应该替换

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