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());
我实现了一个包含 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());