Listview异步加载和检查状态

时间:2014-07-19 17:29:21

标签: android listview android-listview android-asynctask

我有一个带复选框的列表视图。我在UI线程上加载所有数据时遇到了性能问题,所以现在我用AsyncTask加载数据。在AsyncTask的末尾,我使用我的数据创建了我的适配器,并在列表中调用了setAdapter,因此我将适配器创建和适配器设置从onCreate()移动到了一个在结束时调用的回调。 AsyncTask。通过这种方式,我遇到了复选框状态的问题。在原始版本中,状态是自动管理的,但现在不再,为什么?

编辑:已发布的适配器

private class AppAdapter extends BaseAdapter {

    private class ViewHolder {
        TextView tv;
        ImageView iv;
    }

    private ArrayList<Map<String, Object>> itemList;
    private String imageFrom;
    private String textFrom;
    private PackageManager pm;
    private Context c;
    int resLayout;
    int resImage;
    int resText;

    public AppAdapter(Context context, ArrayList<Map<String, Object>> data,
            int resource, String image, String text, int resImg, int resTxt) {
        resLayout = resource;
        resImage = resImg;
        resText = resTxt;
        c = context;
        if (data != null)
            itemList = data;
        else
            itemList = new ArrayList<Map<String, Object>>();
        imageFrom = image;
        textFrom = text;
        pm = context.getPackageManager();
    }

    public void loadData(ArrayList<Map<String, Object>> data) {
        itemList.addAll(data);
        this.notifyDataSetChanged();
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View v = null;
        ViewHolder vh = null;
        if (convertView == null) {
            vh = new ViewHolder();
            LayoutInflater inflater = (LayoutInflater) c
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = inflater.inflate(resLayout, parent, false);
            vh.iv = (ImageView) v.findViewById(resImage);
            vh.tv = (TextView) v.findViewById(resText);
            v.setTag(vh);
        } else {
            vh = (ViewHolder) convertView.getTag();
            v = convertView;
        }

        if (!itemList.isEmpty()) {
            ApplicationInfo r = (ApplicationInfo) itemList.get(position)
                    .get(imageFrom);
            vh.iv.setImageDrawable(r.loadIcon(pm));
            vh.tv.setText((String) itemList.get(position).get(textFrom));
        }
        return v;
    }

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

    @Override
    public Object getItem(int position) {
        return itemList.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }
}

0 个答案:

没有答案