我在滑动标签视图中的片段内部有一个ListView。我为listview创建了一个自定义适配器,扩展了BaseAdapter。问题是,当我调用notifyDataSetChanged()
getView时,会调用几次(OK),但只有在最后一次调用时,convertView
参数才有效。在前几次调用中,它提供了一个有效的(非null)视图对象,但它不是实际显示的视图。我知道这是真的,因为无效convertViews
的更新不会显示在屏幕上。 SensorViewHolder是私有静态视图者类。我知道适配器只有一个实例,因为适配器对象的ID没有改变,这也意味着我可以确定滑动选项卡视图中只有一个片段。这是一个问题的原因是因为一旦我使用此适配器的多个列表项,setBackground()
不再有效,即使其他项(一些TextViews)能够设置其文本没有任何问题。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
Log.d(TAG, "View updating...");
View vi = convertView;
SensorViewHolder holder;
if (convertView == null) {
holder = new SensorViewHolder();
vi = inflater.inflate(R.layout.tab_sensor, null);
holder.name = (TextView) vi.findViewById(R.id.tab_sensor_name);
holder.weight = (TextView) vi.findViewById(R.id.tab_sensor_weight);
holder.unit = (TextView) vi.findViewById(R.id.tab_sensor_unit);
holder.selectionLayout = (RelativeLayout) vi.findViewById(R.id.tab_sensor_selection);
holder.onSelectListener = new OnSelectListener(position);
holder.selectionLayout.setOnTouchListener(holder.onSelectListener);
} else
holder =(SensorViewHolder) vi.getTag();
vi.setTag(holder);
if (prevSelected != selected) {
if (position == selected)
holder.selectionLayout.setBackground(bgSelected);
else
holder.selectionLayout.setBackground(bgUnselected);
}
if (position == getCount() - 1)
prevSelected = selected;
// update rest of components
return vi;
}
编辑:我对此进行了更多调查,发现无效视图无效且脏。为什么getView()
会给我脏的,无效的观点?