//////////////////////
MyAdapter mMyAdapter;
GridView mGridView;
mGridView.setAdapter(mMyAdapter);
mMyAdapter.setData(anyDataList);
isListView = true;
/////////// When click on button [named: SwitchView] ///////////
if (isListView) {
isListView = false;
mGridView.setNumColumns(1);
mMyAdapter.setIsListView(true);
mMyAdapter.notifyDataSetChanged();
} else {
isListView = true;
mGridView.setNumColumns(1);
mMyAdapter.setIsListView(false);
mMyAdapter.notifyDataSetChanged();
}
/////////// Adapter Class Defination ///////////
class MyAdapter extends ArrayAdapter<MyClass> {
List<MyClass> mData;
boolean mIsListView;
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
// reuse views
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
if (mIsListView) {
rowView = inflater.inflate(R.layout.list_view, parent, false);
} else {
rowView = inflater.inflate(R.layout.grid_view, parent, false);
}
// configure view holder
ViewHolder viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);
rowView.setTag(viewHolder);
}
// fill data
ViewHolder holder = (ViewHolder) rowView.getTag();
holder.text.setText(mData.getName());
return rowView;
}
public void setData(List<MyClass> data) {
mData = data;
}
public void setIsListView(boolean isListView) {
mIsListView = isListView;
}
}
///////////什么是我的要求///////////
当我单击按钮SwitchView时,适配器应为list_view或grid_view布局充气。
///////////问题///////////
在我的情况下,适配器中的数据相同,但是视图正在改变。但是,当我单击按钮SwitchView时,我得到了一些例外的结果。GridView显示两种布局类型(list_view和grid_view)。在某些列表位置,它显示布局“ list_view”,在其他位置,它显示布局“ grid_view”。
///////////原因///////////出现
此问题是因为getView()保留了旧视图。
///////////解决方案///////////
代替使用mMyAdapter.notifyDataSetChanged(),应实例化新的mMyAdapter。但我想知道是否还有另一种解决方案。我不想实例化新的适配器。
无需创建新的适配器。只需要利用适配器的视图类型。在MyAdapter类中,重写视图类型计数。例如:
@Override
public int getViewTypeCount() {
return 2;
}
接下来,重写该getItemViewType
方法以返回它是网格还是列表。例如:
@Override
public int getItemViewType(int position) {
return mIsListView ? 1 : 0;
}
最后,在该getView
方法中,检查头寸项目类型,以确定要膨胀的布局。然后,您可以继续填充视图。例如:
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View rowView = convertView;
ViewHolder viewHolder;
// reuse views
if (rowView == null) {
LayoutInflater inflater = context.getLayoutInflater();
if (getItemViewType(position) == 1) {
rowView = inflater.inflate(R.layout.list_view, parent, false);
} else {
rowView = inflater.inflate(R.layout.grid_view, parent, false);
}
// configure view holder
viewHolder = new ViewHolder();
viewHolder.text = (TextView) rowView.findViewById(R.id.TextView01);
rowView.setTag(viewHolder);
} else {
viewHolder = (ViewHolder) rowView.getTag();
}
holder.text.setText(mData.getName());
return rowView;
}
注意,此示例演示仅使用视图类型来确定要扩展的视图。如果数据必须以不同的方式填充每种视图类型,则还需要使用视图类型来确定。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句