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;
}