-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

謝謝,這是有效的。 –