-1

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

enter image description here

这是片段:

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位置重新开始我不明白这一点。

你有什么想法吗?

+0

很明显,这是因为回收,你基本上什么也不做,当视图被重用......你如果执行模式ViewHolder是错误的。 – Selvin

+0

好的,我在这里做错了什么? –

+0

当convertView!= null时,你什么都不做。请检查任何ViewHolder示例以查看您应该执行的操作。 – Selvin

回答

2

此时应更换

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

谢谢,这是有效的。 –