use*_*117 4 android android-listview
我试图绕过getView()并且我认为Android中没有任何主题可以在StackOverflow和其他地方产生更多的混淆和问题.每个人都想知道为什么它被调用了这么多次或者按什么顺序被调用,但正如Romain Guy 在这里所说的那样," 绝对不能保证调用getView()的顺序也不能保证多少次. "
所以我有一个不同的问题:我不理解convertView参数.
我有一个包含15个项目的列表,其中11个可以放在屏幕上.我的应用程序第一次启动getView()被调用48次.
convertView在第一次调用时为位置0为空,对于位置1-11为非空,然后对于位置0为非空,对于位置1-11为空,对于位置0为null,对于位置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
Run Code Online (Sandbox Code Playgroud)
第一次x,在x屏幕上可见的项目数量附近的数字convertView是,null.您需要实例化一个新View的返回.
向下滚动时,现有图像View被向上推到视线之外.它现在可以重复使用,而不是破坏它.你会注意到,View在从下面推入一个new之前,你的getView方法被调用,并且有效convertView.这正是View之前推出的视图(或者可能是另一个,还有一些额外的逻辑)!
因此,View您可以重复使用View并使其适应所item代表的新内容,而不是重新实例化您的代价.你会经常看到类似的东西:
View view = convertView;
if(view == null){
view = LayoutInflater.from(getContext()).inflate(...);
}
// 'bind' view
return view;
Run Code Online (Sandbox Code Playgroud)
您的getView方法在启动时被调用48次这一事实可能实际上是您的代码的问题.
| 归档时间: |
|
| 查看次数: |
5059 次 |
| 最近记录: |