GetView中的ConvertView()

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)

nha*_*man 6

第一次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 次

最近记录:

10 年,5 月 前