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