【发布时间】:2014-05-09 18:22:32
【问题描述】:
我正试图围绕 getView() 进行思考,我认为 Android 中没有任何话题会在 StackOverflow 和其他地方造成更多的混乱和问题。每个人都想知道为什么它被调用了这么多次或者以什么顺序或根本不被调用,但正如 Romain Guy 所说 here ,“绝对不能保证调用 getView() 的顺序,也不多少次。"
所以我有一个不同的问题:我不明白 convertView 参数。
我有一个包含 15 个项目的列表,其中 11 个可以显示在屏幕上。我的应用程序第一次启动时 getView() 被调用了 48 次。
convertView 在第一次调用时位置 0 为空,位置 1-11 为非空,然后位置 0 非空,位置 1-11 为空,然后位置 0 为空,位置非空1-11,最后是位置 0-11 的非空值。
有人能解释一下为什么/什么时候 convertView 是 null 还是非 null,它是如何/为什么在大多数位置开始为非 null 的,以及为什么相同的位置似乎在这两种状态之间来回反弹?
如果能提供用清晰的英语编写的、详细解释 convertView 的优秀教程的参考资料,我们也将不胜感激。
PS - 我的测试是在运行 Android 2.3.5 的设备上完成的,如果这很重要的话。我知道 Google 从那时起已经多次更改 ListActivity/adapter/getView 的内容。
根据请求,我包含了适配器代码(我隐藏了一些专有名称)。不幸的是,我无法回答任何“你为什么这样做?”问题,因为不是我写的
protected class PLxxxAdapter extends BaseAdapter {
public PLxxxAdapter(Context c) {
}
@Override
public int getCount() {
return listItems.size();
}
@Override
public Object getItem(int position) {
return listItems.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
boolean select;
if (convertView == null) {
LayoutInflater vi = (LayoutInflater) getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = vi.inflate(R.layout.PLxxxitem, null);
//This is still needed even though we point to an XML description
convertView.setLayoutParams(new ListView.LayoutParams(
ListView.LayoutParams.MATCH_PARENT,
ListView.LayoutParams.MATCH_PARENT));
holder = new ViewHolder();
//Get the views of the row
holder.itemView = (TextView)convertView.findViewById(R.id.post);
holder.cV1 = (CheckedTextView)convertView.findViewById(R.id.check1);
//Init the 'confirm' box listener
holder.cV1.setCompoundDrawablesWithIntrinsicBounds(0, R.layout.smallcb, 0, 0);
holder.cV1.setOnClickListener(new ConfBoxListener());
convertView.setTag(holder);
holder.cV1.setTag(holder); //These views need tags for onClick()
}
else {
holder = (ViewHolder)convertView.getTag(); // convertview NOT null
}
try {
int liSize = listItems.size();
if (position < liSize) {
holder.itemView.setText(listItems.get(position));
}
}
catch (Exception e) {
Log.e ("PLxxxActivity.getView Crash", "details " + e);
}
holder.cV1.setChecked(confirmed.get(position));
select = selected.get(position);
if (select == true) {
convertView.setBackgroundResource(R.color.colBlue);
}
else
convertView.setBackgroundResource(R.color.colGrey);
holder.position = position;
if (RemoteControlActivity.confCBs == true)
holder.cV1.setVisibility(View.VISIBLE);
else
holder.cV1.setVisibility(View.INVISIBLE);
return convertView;
} // end getView
} //end class PLxxxAdapter
【问题讨论】:
-
正如我的回答中所述,您的
getView方法被调用 48 次这一事实可能是您的代码中的一个问题。如果您可以展示您如何设置适配器以及如何处理它,也许我们也可以为您提供帮助。 -
@user1199931 之后它不会总是为非空值。至少可以在屏幕上显示的视图数量为空(但是,当您获得大小可能不同的视图或多个项目视图类型时,这会变得更加复杂)