通过适配器中的getview()删除视图保留

尚基班萨尔(Shanki Bansal)
//////////////////////  
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。但我想知道是否还有另一种解决方案。我不想实例化新的适配器。

杰伊·索耶(Jay Soyer)

无需创建新的适配器。只需要利用适配器的视图类型。在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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

Android,适配器的getView中的NullPointerException

适配器中getView方法的NullPointerException

通过单击适配器的getView()中的imageView来更改图像

getView()中的自定义适配器错误

在适配器中获取多个数据单元getView()

自定义适配器getView中的IndexOutOfBounds异常

Android:从viewPager中的Fragment调用ListView的适配器的getview()

自定义适配器的getview中的NullPointerException

从ExpandableList适配器中删除项目

NullPointer异常适配器getView

适配器 getView() 方法未访问

从RecyclerView适配器中删除数据子级,而不会影响当前可见的视图

自定义列表视图和适配器覆盖getView,更改文本颜色

回收器视图适配器中的选项菜单

自定义视图的适配器中的NullPointerException

在适配器中以编程方式刷新列表视图

Android - 在数据绑定适配器中传递视图

Android ListView中适配器和模板视图的组合

如何在活动中更新适配器的文本视图

Firebase从RecyclerView适配器中删除子级

在Windows中删除网络适配器

getView()如何在自定义适配器中工作?

Android ListView适配器,其中包含getView中的按钮,这些按钮可更改布局

在getView上的自定义适配器中以编程方式添加textviews

listview项目未在自定义适配器的getview方法中显示分配的值

如果条件在自定义适配器中不起作用(getView())

在调试的自定义适配器中未调用Getview,发现位置返回为-1

适配器中的getActivity()

适配器中的ArrayList?