Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/215.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 如何使用分隔符实现ViewHolder模式?_Android_Android Viewholder - Fatal编程技术网

Android 如何使用分隔符实现ViewHolder模式?

Android 如何使用分隔符实现ViewHolder模式?,android,android-viewholder,Android,Android Viewholder,我有一个列表视图,显示两种不同类型的数据,一种是分隔符。每个数据类型都存储在一个数组列表中。因此,有两个列表。每个列表的内容通过一个特殊的行(分隔符)与另一个列表的内容分开。第一行也是分隔行。在getView中,我必须区分普通数据行和分隔行 // returns true if a separator row must be displayed at pos. private boolean isSeperator(int pos) { return pos == 0 || p

我有一个列表视图,显示两种不同类型的数据,一种是分隔符。每个数据类型都存储在一个数组列表中。因此,有两个列表。每个列表的内容通过一个特殊的行(分隔符)与另一个列表的内容分开。第一行也是分隔行。在
getView
中,我必须区分普通数据行和分隔行

// returns true if a separator row must be displayed at pos. 
private boolean isSeperator(int pos) {
        return pos == 0 || pos == data.size() + 1;
}

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

    LayoutInflater infalInflater = (LayoutInflater) this.context
            .getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    if(isSeperator(position)) {
        convertView = infalInflater.inflate(R.layout.list_view_seperator, parent, false);
        TextView seperator = (TextView) convertView.findViewById(R.id.tv_list_view_seperator);
        seperator.setText("Seperator");
    }
    else {
        convertView = infalInflater.inflate(R.layout.my_layout, parent, false);

        TextView txtview = (TextView) convertView.findViewById(R.id.foo);
        ImageView icon = (ImageView) convertView.findViewById(R.id.bar);

        MyData myData = (MyData) getItem(position);
        txtview.setText(myData.getName());
        icon.setImageBitmap(myData.getIcon());
    }

    return convertView;
}
首先,我检查是否必须在当前位置显示分隔符。这个很好用


我试图实现视图持有者模式,但总是失败。有人能告诉我,在必须考虑不同类型的行(包括分隔符)的情况下,如何使用这种模式吗

根据您确定一行是分隔符(第一行还是最后一行)的条件,它似乎不需要成为此列表的一部分


如果需要分隔符与列表一起滚动,请考虑使用
ListView.addHeader(视图视图)
ListView.addFooter(视图视图)
(在执行
ListView.setAdapter(ListAdapter ListAdapter)
之前需要设置这些分隔符。

根据您确定行是分隔符(第一行还是最后一行)的条件,似乎它不需要成为这个列表的一部分


如果需要分隔符与列表一起滚动,请考虑改用
ListView.addHeader(视图视图)
ListView.addFooter(视图视图)
(需要在执行
ListView.setAdapter(ListAdapter ListAdapter)
之前设置这些分隔符。

如果要实现separators,我强烈建议您使用
适配器中的viewType机制执行此操作。因此,如果您的适配器已经提供一种类型的
视图
,您可以覆盖:

private final static int TYPE_SEPARATOR = 0;
private final static int TYPE_ITEM = 1;


@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return isSeparator(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
这样,当调用您的
getView()
时,您将拥有正确类型的
convertView
(也可以是
null
),您应该可以使用以下内容:

private final LayoutInflater mInflater;

public MyAdapter(Context context) {
    mInflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (isSeparator(position)) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_separator, parent, false);
        }

        setupSeparator(convertView);
    } else {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, parent, false);
        }

        setupListItem(convertView, position);
    }

    return convertView;
}

private boolean isSeparator(int position) {
    return position == 0 || position == data.size() + 1;    // Is the + 1 needed here?
}

如果您想实现separators,我强烈建议您使用
适配器中的viewType机制来实现。因此,如果您的适配器已经提供一种类型的
视图
,您可以覆盖:

private final static int TYPE_SEPARATOR = 0;
private final static int TYPE_ITEM = 1;


@Override
public int getViewTypeCount() {
    return 2;
}

@Override
public int getItemViewType(int position) {
    return isSeparator(position) ? TYPE_SEPARATOR : TYPE_ITEM;
}
这样,当调用您的
getView()
时,您将拥有正确类型的
convertView
(也可以是
null
),您应该可以使用以下内容:

private final LayoutInflater mInflater;

public MyAdapter(Context context) {
    mInflater = LayoutInflater.from(context);
}

@Override
public View getView(int position, View convertView, ViewGroup parent) {
    if (isSeparator(position)) {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_separator, parent, false);
        }

        setupSeparator(convertView);
    } else {
        if (convertView == null) {
            convertView = inflater.inflate(R.layout.list_item, parent, false);
        }

        setupListItem(convertView, position);
    }

    return convertView;
}

private boolean isSeparator(int position) {
    return position == 0 || position == data.size() + 1;    // Is the + 1 needed here?
}

您好,我知道这些方法,
ListView.addHeader(View-View)
确实是一个很好的解决方案。但是,第二个分隔符位于我的两个列表的内容之间,不能也不能放在列表视图的末尾。每个分隔符都是以下行的标题。是否有两个ListView?“AutoLM”是什么意思?“Ataulm”是指他把两个来源的数据混合到这一个适配器中。据我所知,确切地说,我有两个来源的数据(两个数组列表)。考虑创建一个适配器来处理这两个列表(和相关的分隔符)合并成一个单一的数据源。然后你可以将seb的答案与视图类型结合起来。嗨,我知道这些方法,而且
ListView.addHeader(view-view)
确实是一个很好的解决方案。但是,第二个分隔符位于我的两个列表的内容之间,不能也不能放在列表视图的末尾。每个分隔符都是以下行的标题。是否有两个ListView?“AutoLM”是什么意思?“Ataulm”是指他把两个来源的数据混合到这一个适配器中。据我所知,确切地说,我有两个来源的数据(两个数组列表)。考虑创建一个适配器来处理这两个列表(和相关的分隔符)合并成一个单一的数据源。然后你可以将seb的答案与视图类型结合起来;这里有一个来自谷歌的例子;这个解决方案对我有效。此外,我还可以提高我的拼字技能:P。这个解决方案对我很有效。此外,我还可以提高我的拼字技能:P。