ArrayAdapter有时不执行getView()方法(取决于设备)

时间:2014-03-31 13:13:52

标签: android listview android-arrayadapter baseadapter

对于ArrayAdapter的子类,我有以下代码:

public class DashboardListAdapter extends ArrayAdapter<RowItem> {

    Context context;
    Integer deviceID;
    private Integer size;

    public DashboardListAdapter(Context context, int resourceId,
            List<RowItem> items, Bitmap b, Integer id) {
        super(context, resourceId, items);
        this.size = items.size();
        this.deviceID = id;
        this.context = context;
    }

    /*private view holder class*/
    private class ViewHolder {
        ImageView imageView;
        TextView txtTitle;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;

        RowItem rowItem = getItem(position);

        LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        if (convertView == null) 
        {
            convertView = mInflater.inflate(R.layout.dashboard_item, null);
            holder = new ViewHolder();
            holder.txtTitle = (TextView) convertView.findViewById(R.id.title);
            holder.imageView = (ImageView) convertView.findViewById(R.id.icon);
            convertView.setTag(holder);
        } 
        else
            holder = (ViewHolder) convertView.getTag();

        if (!isTablet(context))
        {
            holder.txtTitle.setTextSize(15);
        }
        return convertView;
    }

    @Override
    public int getCount()
    {
        return size;
    }
}

将其设置为ListView,如下所示:

itemAdapter = new DashboardListAdapter(getApplicationContext(), R.layout.menufragment_item, itemArray, bitmap, deviceID);
            lv.setAdapter(itemAdapter);

当应用程序打开并正常工作时运行,但是当我与Web服务同步时,我调用一个不同的方法,该方法传入一组新的List项,ListView显示为空,并在调试getView()时永远不会调用适配器。

我研究了一些东西并添加了Overridden&#34; getCount&#34;当时工作的方法,现在它不起作用并再次显示空白屏幕。我也改变了适配器以扩展baseAdapter,并相应地修改适配器类,但这个问题仍然存在。为了让事情变得更有趣,我在10&#34; Nexus平板电脑和Nexus 4,而三星Galaxy Tab 10.1和Nexus 7(2012)缝合偶尔会出现此错误。

当ListView为空并且我旋转屏幕时,显示屏会刷新并显示正确的信息,如果我锁定则会显示相同信息,然后解锁设备。

1 个答案:

答案 0 :(得分:1)

&#34;当ListView为空并且我旋转屏幕时,显示屏会刷新并显示正确的信息,如果我锁定然后解锁设备则相同。&#34;

可能导致未调用getView()方法的唯一问题是getCount返回0或其他预期值。

正如我所看到的,传递项目列表的唯一方法是在适配器构造函数中。这就是屏​​幕旋转后刷新的原因。 (活动被重新创建,你的适配器也是如此,瞧!)

您的适配器应如下所示:

   List<RowItem> items;

   public void setItemList(List<RowItem> newItems){
        this.items = newItems;
        this.notifyDataSetChanged();
   }

   public int getCount(){
        return this.items == null?0:this.items.size();

   }

同步时,只需调用setItemList(newSyncedItems);