getView()为同一位置多次调用

时间:2014-05-26 10:24:36

标签: android android-listview android-arrayadapter

我试图将文件数组加载到ListView ...这里我的文件数组从DB返回1条记录。我将此数组加载到我的自定义arrayAdapter ..

问题:

CustomArrayAdapter getView()方法为第0个位置调用3次

第一次convertView将为null

第二次convertView不为空

第三次convertView再次为null

这是我的代码,

ArrayList files = null;

            try {
                files = db.getRecords(tableName, null, Type LIKE '.txt' , null, null, null, null);
            } catch (Exception e) {
                e.printStackTrace();
            }

            /*** files.size() = 1 ***/

            infoAdt = new InfoAdapter(mContext, R.layout.custome_view, files);
            setListAdapter(infoAdt);

            public class InfoAdapter extends ArrayAdapter<Object>  {

        public InfoAdapter(Context context, int textViewResourceId, List<Object> objects) {
            super(context, textViewResourceId,objects);
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {

             if (convertView == null) {      

                 LayoutInflater inf = (LayoutInflater) getActivity().getSystemService(Context.LAYOUT_INFLATER_SERVICE);
                 convertView = inf.inflate (R.layout.custome_view, parent, false);      

                 ViewHolder viewHolder = new ViewHolder();
                 viewHolder.nameView = (TextView) convertView.findViewById(R.id.name);
                 viewHolder.typeView = (TextView) convertView.findViewById(R.id.type);
                 viewHolder.sizeView = (TextView) convertView.findViewById(R.id.size);

                 convertView.setTag(viewHolder);
             }

             ViewHolder holder = (ViewHolder) convertView.getTag();

            FileItem f = (FileItem) getItem(position);          

            String[] fileNameAndType= f.getFileName().split("\\.");

            holder.nameView.setText(fileNameAndType[0]);
            holder.typeView.setText(fileNameAndType[1]);

            return convertView;
        }
    }

    class ViewHolder{
        TextView nameView;
        TextView typeView;
        TextView sizeView;
    }

1 个答案:

答案 0 :(得分:2)

正常情况下多次请求索引0视图。测量/布局需要它。

您可以在getView()中放置一个调试器断点,以了解为什么在每种情况下通过观察调用堆栈调用适配器getView()

确保您的ListView不在需要多个度量/布局传递的布局中,例如LinearLayout具有权重或RelativeLayout具有复杂约束。

出于性能原因,让getView()尽快返回视图。