Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/191.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 在我的ListAdapter中设置自定义视图时出现问题_Android_Listview_Android Listview_Simpleadapter - Fatal编程技术网

Android 在我的ListAdapter中设置自定义视图时出现问题

Android 在我的ListAdapter中设置自定义视图时出现问题,android,listview,android-listview,simpleadapter,Android,Listview,Android Listview,Simpleadapter,我有一个包含各种元素的列表视图,它会更新很多次。 我想在一些随机位置之后添加一行seperator,比如,在第三元素、第七元素、第十七元素、第十九元素等之后 因此,我设计了一个包含分隔符的xml文件,并使用customSimpleAdapter在这些位置将其膨胀。然而,当我运行我的代码时,分隔符被添加到奇怪的位置,使我的列表看起来太难看,有时会出现,不幸的是,你的应用程序已停止错误 我以前从未使用过自定义适配器,也不知道我做错了什么 这是我的简单代码,我添加了注释进行解释 public clas

我有一个包含各种元素的列表视图,它会更新很多次。 我想在一些随机位置之后添加一行seperator,比如,在第三元素、第七元素、第十七元素、第十九元素等之后

因此,我设计了一个包含分隔符的xml文件,并使用custom
SimpleAdapter
在这些位置将其膨胀。然而,当我运行我的代码时,分隔符被添加到奇怪的位置,使我的列表看起来太难看,有时会出现
,不幸的是,你的应用程序已停止
错误

我以前从未使用过自定义适配器,也不知道我做错了什么

这是我的简单代码,我添加了注释进行解释

public class SpecialAdapter extends SimpleAdapter {

    Context context;
    private LayoutInflater mInflater;


    public SpecialAdapter(Context context, ArrayList<HashMap<String, Object>> newsList, int resource,String[] from, int[] to) {
        super(context, newsList, resource, from, to);

        this.context = context;

        mInflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        View view = super.getView(position, convertView, parent);
        // TestApp.endPos holds the positions (it keep changing) after which i want to add                
        // separator
        if (position == TestApp.endPos){
            /* my Arraylist is of type HashMap<String, Object>
             * I have added an empty element and add the seperator view in                  
             * it.
             */
            TestApp.arrayList.add(new HashMap<String, Object>());
            // heads is an xml file of my separator
            view = mInflater.inflate(R.layout.heads, null);
        }

        return view;
    }

}
公共类SpecialAdapter扩展了SimpleAdapter{
语境;
私人停车场;
公共SpecialAdapter(上下文上下文、ArrayList新闻列表、int资源、字符串[]from、int[]to){
超级(上下文、新闻列表、资源、发件人、收件人);
this.context=上下文;
mInflater=(LayoutInflater)上下文
.getSystemService(上下文布局\充气机\服务);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
视图=super.getView(位置、转换视图、父级);
//TestApp.endPos保留我想要添加的位置(它不断变化)
//分离器
如果(位置==测试PP.endPos){
/*我的Arraylist是HashMap类型
*我添加了一个空元素,并在中添加了分隔器视图
*它。
*/
TestApp.arrayList.add(newhashmap());
//heads是我的分隔符的xml文件
视图=最小充气(R.layout.heads,空);
}
返回视图;
}
}

有人能帮我简化我的问题吗?我做错了什么?

在您的
getView
方法中,您应该确定是否要使用
分隔符查看视图,然后为该项目充气:

if (view == null) {
      if (showSeperatorItem)
          view = _activity.getLayoutInflater().inflate(R.layout.item__row_layout_with_seperator, parent, false);
      else
          view = _activity.getLayoutInflater().inflate(R.layout.item__row_layout, parent, false);
}

super.getView
一次可以显示多少视图,就可以显示多少视图。稍后,它将重新使用它们

因为您以后会膨胀自己的布局,所以它会缓存在顶部。最后,
super.getView
开始以随机位置返回自定义视图

要克服这个问题,您需要告诉适配器有两种类型的视图,以便它分别缓存它们

以下是示例方法(未经测试,但应可行):

@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
如果(位置==测试PP.endPos){
//手动处理分隔符视图
TestApp.arrayList.add(newhashmap());
//如果尚未缓存分隔符,请创建视图
if(convertView==null){
convertView=mInflater.充气(右布局头部,空);
}
}否则{
//普通视图由适配器处理
convertView=super.getView(位置、convertView、父级);
}
返回视图;
}
@凌驾
public int getViewTypeCount(){
//有两种类型:分隔符和普通
返回2;
}
@凌驾
public int getItemViewType(int位置){
如果(位置==测试PP.endPos){
//分隔视图
返回0;
}否则{
//正常视图
返回1;
}
}

注意:有两种类型,意味着两种类型的视图将被缓存和重用。

一个更好的解决方案!可能仍然会失败,除非每次调用
getView
时都进行充气,否则效率会非常低。@user3249477同意,我不知道您在上面的答案中发布了
getItemViewType
。每天都是上学的日子。
@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (position == TestApp.endPos) {
        // Handle separator views manually
        TestApp.arrayList.add(new HashMap<String, Object>());

        // If separator is not yet cached, create the view
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.heads, null);
        }
    } else {
        // Normal views are handled by the adapter
        convertView = super.getView(position, convertView, parent);
    }

    return convertView;
}

@Override
public int getViewTypeCount() {
    // There are 2 types: separator and normal
    return 2;
}

@Override
public int getItemViewType(int position) {
    if (position == TestApp.endPos) {
        // Separator view
        return 0;
    } else {
        // Normal view
        return 1;
    }
}