Android 通过适配器中的getview()删除视图保持 // MyAdapter mMyAdapter; GridView-mGridView; mGridView.setAdapter(mMyAdapter); mMyAdapter.setData(anyDataList); isListView=true; ///////////单击按钮[named:SwitchView]// 如果(isListView){ isListView=false; mGridView.setNumColumns(1); mMyAdapter.setIsListView(true); mMyAdapter.notifyDataSetChanged(); }否则{ isListView=true; mGridView.setNumColumns(1); mMyAdapter.setIsListView(false); mMyAdapter.notifyDataSetChanged(); } ///////////适配器类定义// 类MyAdapter扩展了ArrayAdapter{ 列出mData; 布尔错误列表视图; @凌驾 公共视图getView(最终整数位置、视图转换视图、视图组父视图){ 视图行视图=转换视图; //重用视图 if(rowView==null){ LayoutInflater充气器=上下文。getLayoutInflater(); 如果(错误列表视图){ rowView=充气机。充气(R.layout.list\u视图,父视图,false); }否则{ 行视图=充气机。充气(R.layout.grid_视图,父视图,false); } //配置视图保持架 ViewHolder ViewHolder=新ViewHolder(); viewHolder.text=(TextView)rowView.findViewById(R.id.TextView01); rowView.setTag(viewHolder); } //填充数据 ViewHolder=(ViewHolder)rowView.getTag(); holder.text.setText(mData.getName()); 返回行视图; } 公共无效设置数据(列表数据){ mData=数据; } public void setIsListView(布尔isListView){ mIsListView=isListView; } }
///////////我的要求是什么////Android 通过适配器中的getview()删除视图保持 // MyAdapter mMyAdapter; GridView-mGridView; mGridView.setAdapter(mMyAdapter); mMyAdapter.setData(anyDataList); isListView=true; ///////////单击按钮[named:SwitchView]// 如果(isListView){ isListView=false; mGridView.setNumColumns(1); mMyAdapter.setIsListView(true); mMyAdapter.notifyDataSetChanged(); }否则{ isListView=true; mGridView.setNumColumns(1); mMyAdapter.setIsListView(false); mMyAdapter.notifyDataSetChanged(); } ///////////适配器类定义// 类MyAdapter扩展了ArrayAdapter{ 列出mData; 布尔错误列表视图; @凌驾 公共视图getView(最终整数位置、视图转换视图、视图组父视图){ 视图行视图=转换视图; //重用视图 if(rowView==null){ LayoutInflater充气器=上下文。getLayoutInflater(); 如果(错误列表视图){ rowView=充气机。充气(R.layout.list\u视图,父视图,false); }否则{ 行视图=充气机。充气(R.layout.grid_视图,父视图,false); } //配置视图保持架 ViewHolder ViewHolder=新ViewHolder(); viewHolder.text=(TextView)rowView.findViewById(R.id.TextView01); rowView.setTag(viewHolder); } //填充数据 ViewHolder=(ViewHolder)rowView.getTag(); holder.text.setText(mData.getName()); 返回行视图; } 公共无效设置数据(列表数据){ mData=数据; } public void setIsListView(布尔isListView){ mIsListView=isListView; } },android,gridview,android-arrayadapter,Android,Gridview,Android Arrayadapter,///////////我的要求是什么//// 当我点击按钮SwitchView时,适配器应该膨胀列表视图或网格视图布局 ///////////问题//// 在我的例子中,适配器中的数据是相同的,但它的视图正在更改。但当我点击按钮SwitchView时,我得到了一些未被接受的结果。GridView显示两种布局类型(列表视图和网格视图)。在某些列表位置显示布局“列表视图”,在另一些位置显示布局“网格视图” ///////////原因///br> 这个问题的出现是因为getView()持有旧的视图 /
当我点击按钮SwitchView时,适配器应该膨胀列表视图或网格视图布局 ///////////问题////
在我的例子中,适配器中的数据是相同的,但它的视图正在更改。但当我点击按钮SwitchView时,我得到了一些未被接受的结果。GridView显示两种布局类型(列表视图和网格视图)。在某些列表位置显示布局“列表视图”,在另一些位置显示布局“网格视图” ///////////原因///br> 这个问题的出现是因为getView()持有旧的视图 ///////////解决方案////
代替使用mMyAdapter.notifyDataSetChanged(),应实例化新的mMyAdapter。但我想知道是否还有其他解决办法。我不想实例化新适配器。您可以避免使用视图保持器,但这样会影响列表的性能。我相信切换布局不仅仅是数据集更改,而是充气机的整个布局更改任务,因此,实例化新适配器或避免使用视图保持架似乎没有其他方法。无需创建新适配器。只需要利用适配器的视图类型。在MyAdapter类中,重写视图类型计数。例如:
//////////////////////
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;
}
}
接下来重写getItemViewType
方法以返回它是网格还是列表。例如:
@Override
public int getViewTypeCount() {
return 2;
}
最后,在getView
方法中,检查位置项目类型,以确定要充气的布局。然后可以继续填充视图。例如:
@Override
public int getItemViewType(int position) {
return mIsListView ? 1 : 0;
}
注意,此示例演示如何使用视图类型来确定要充气的视图。如果您认为数据必须以不同的方式填充每个视图类型,那么您还需要使用视图类型来确定。请发布完整的代码isListView和mIsListView的值是如何确定的我已经更新了我的代码。假设它将像切换按钮一样工作。每次单击按钮时,isListView和mIsListView都会更改。
@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;
}