0

我有一个绑定到列表视图的自定义适配器。那部分很好。当我滚动列表视图时,排序被抛出,因为如果我滚动回到开头(即向下滚动后向上滚动),显示的 TextView 不是第一个。在滚动过程中我必须在适配器中处理什么吗?

public class TextViewAdapter extends BaseAdapter 
{
    private Context context;

    public TextViewAdapter(Context c) 
    {
        context = c;
    }

    //---returns the number of images---
    public int getCount() {
        return textViews.size();
    }

    //---returns the ID of an item--- 
    public Object getItem(int position) {
        return position;
    }

    public long getItemId(int position) {
        return position;
    }

    //---returns an TextView---
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        TextView tv;
        Log.d("Position",  Integer.toString(position));
        if (convertView == null) {

            tv = (TextView)textViews.get(position);
        } else {
            tv = (TextView) convertView;
        }            
        return tv;
    }
}
4

3 回答 3

1

getView以错误的方式实现方法。如果你使用convertView你应该重置它的文本内容,比如

public View getView(int position, View convertView, ViewGroup parent) 
{
    TextView tv;
    Log.d("Position",  Integer.toString(position));
    if (convertView == null) {

        tv = (TextView)textViews.get(position);
    } else {
        tv = (TextView) convertView;
        // HERE, set its content
        tv.setText(textViews.get(position).getText().toString());
    }            
    return tv;
}

AListView将在滚动时为您回收子视图,因此一些子视图变得不可见,从而变得可重用。这就是为什么every 一convertView开始为空但ListView向下滚动时变为非空的原因。但是那些 not nullconvertView仍然保留它们的原始文本内容,您应该手动重置它们的内容。

顺便说一句,你不需要TextView在应用程序启动时进行很多新的,只需一个列表就可以了String,比如

/* somewhere else */
List<String> strings = ...

public class TextViewAdapter extends BaseAdapter 
{
    /* ... */

    //---returns the number of images---
    public int getCount() {
        return strings.size();
    }

    /* ... */

    //---returns an TextView---
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        TextView tv;
        Log.d("Position",  Integer.toString(position));
        if (convertView == null) {
            tv = new TextView(context);
            tv.setText(strings.get(position));
        } else {
            tv = (TextView) convertView;
            // HERE, set its content
            tv.setText(strings.get(position));
        }            
        return tv;
    }
}
于 2012-12-14T01:42:11.963 回答
0

您将遇到的一个主要问题是您试图保存对适配器使用的视图的引用:

tv = (TextView)textViews.get(position);

问题是您正在与 Adapter 中的回收商竞争,这将产生不可预测的结果……总之,您不能这样做。请观看Android 开发人员的 ListView 世界了解更多信息。

简而言之,您应该更改您的方法,以便您的适配器保留 TextView 将显示的字符串列表,而不是 TextView 本身。

于 2012-12-14T01:48:26.427 回答
0

如果 convertView 为空,您应该重新充气视图,否则您需要重置 convertView 上的数据。

于 2012-12-14T02:07:59.650 回答