Android 使用listview和自定义TextView适配器进行滚动会影响订购吗?

Android 使用listview和自定义TextView适配器进行滚动会影响订购吗?,android,Android,我有一个绑定到listview的自定义适配器。那部分很好。当我滚动listview时,顺序被取消,因为如果我滚动回开始(即向下滚动后向上滚动),显示的TextView不是第一个。在滚动期间,适配器中是否有我必须处理的内容 public class TextViewAdapter extends BaseAdapter { private Context context; public TextViewAdapter(Context c) { cont

我有一个绑定到listview的自定义适配器。那部分很好。当我滚动listview时,顺序被取消,因为如果我滚动回开始(即向下滚动后向上滚动),显示的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;
    }
}

您以错误的方式实现了
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;
}
ListView
将在滚动时为您循环使用子视图,因此一些子视图不可见,从而变得可重用。这就是为什么每个
convertView
一开始都是空的,但当
ListView
向下滚动时却不是空的。但是那些非空的
convertView
s仍保留其原始文本内容,您应该手动重置其内容

顺便说一句,当应用程序启动时,你不需要新建很多
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;
    }
}
/*其他地方*/
列表字符串=。。。
公共类TextViewAdapter扩展了BaseAdapter
{
/* ... */
//---返回图像的数量---
public int getCount(){
返回strings.size();
}
/* ... */
//---返回一个文本视图---
公共视图getView(int位置、视图转换视图、视图组父视图)
{
文本视图电视;
Log.d(“位置”,整数.toString(位置));
if(convertView==null){
tv=新文本视图(上下文);
tv.setText(strings.get(position));
}否则{
电视=(文本视图)转换视图;
//在这里,设置它的内容
tv.setText(strings.get(position));
}            
返回电视;
}
}

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

tv = (TextView)textViews.get(position);
问题是你正在和回收商竞争适配器,这将产生不可预测的结果。。。简而言之,你不能这样做。请观看Android开发者提供的更多信息


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

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

我看到过膨胀的示例,但在xml布局文件上似乎发生了膨胀。我在运行时动态添加TextView。我要通过什么充气机。充气(R.layout.calendarcell,null);LayoutInflater充气器=(LayoutInflater)mContext.getSystemService(Context.LAYOUT\u充气器\u服务);cellView=充气机。充气(R.layout.calendarcell,null);是的,膨胀只适用于xml中定义的小部件,如果您动态添加它,您可以新建一个TextView并将其分配给convertView。ConvertView只是意味着您可以重新使用它,但当它为空时,您可能需要在正确的时间重新创建它,可以使用xml中的充气器,也可以动态地新建它。