使用AsyncTask单独向列表视图添加项目

时间:2010-07-06 05:55:18

标签: android android-listview android-asynctask

我正在尝试逐个添加ListView项目。因此,如果我说 - 60项 - 应用程序将一次一个地添加视图到列表视图 - 从而向用户显示应用程序正在加载更多内容。

这是我的代码:

try {
        JSONArray j = getTaggsJSON();
        Log.v(TAG, String.valueOf(j.length()));
        a = new createSpecialAdapter(this, R.layout.individual_tagg_view,
                R.layout.list_item, view, j);
        ListView v = this.getListView();
        v.setStackFromBottom(true);
        setListAdapter(a);
        new addViewsToList().execute(j);

    } catch (UnknownHostException e) {
        e.printStackTrace();
    } catch (JSONException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (ServiceException e) {
        e.printStackTrace();
    }

}

private class addViewsToList extends AsyncTask<JSONArray, View, List<View>> {

    protected List<View> doInBackground(JSONArray... jsonArrays) {
        List<View> v = new ArrayList<View>();
        Log.v(TAG, String.valueOf(jsonArrays[0].length()));
        for (int x = 0; x < jsonArrays[0].length(); x++) {
            try {
                Log.v(TAG, jsonArrays[0].getJSONObject(x).toString());
                v.add(ViewAdapter.createTaggView(jsonArrays[0]
                        .getJSONObject(x), c));
            } catch (JSONException e) {
                e.printStackTrace();
            }
            publishProgress(v.get(x));
        }
        return v;
    }

    protected void onProgressUpdate(View... v) {
        Log.v(TAG, "I'm updating my progress!");
        a.notifyDataSetChanged();
    }

    protected void onPostExecute(List<View> views) {
        Log.v(TAG, "i'm done!");
        Log.v(TAG, String.valueOf(views.size()));
    }
}

因此,看起来我的代码正确打印出视图,并将它们正确地放入列表中,但是我的活动什么也没显示。我究竟做错了什么?我之前想过设置适配器 - 当列表中没有视图时 - 然后更新列表被更改的适配器是正确的方法....显然不是..任何人都可以帮助我吗?

如果您需要澄清我的问题,请告诉我。

编辑:这是补充我的问题的适配器代码。

private class SpecialAdapter extends ArrayAdapter<JSONArray> {

    JSONArray json;

    public SpecialAdapter(Context context, int textViewResourceId,
            int listItem, JSONArray j) {
        super(context, textViewResourceId);
        this.json = j;
    }

    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        Log.v(TAG,"I'm inside the getView method.");
        try {
            JSONObject info = json.getJSONObject(position);
            Log.v(TAG,info.toString());



        if (convertView == null) {
            LayoutInflater i = (LayoutInflater) RecentTaggs.this
                    .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            convertView = i.inflate(R.layout.individual_tagg_view, parent,
                    false);
            holder = new ViewHolder();
            holder.username = (TextView) convertView
                    .findViewById(R.id.userName);
            holder.review = (TextView)convertView.findViewById(R.id.review_text);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }

        holder.review.setText(info.getString("review"));

        return convertView;

        } catch (JSONException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

}

我的输出没有输出任何我的Log.v语句,并且在GetView方法中也没有显示它。

1 个答案:

答案 0 :(得分:1)

  • 肯定有问题 使用适配器。你永远不应该 保存应显示在的视图 ListView自己。只保存 创建数据所需的数据 查看并覆盖getView方法 您的适配器创建所需的 视图。

  • 第二件事就是你的名单 正在使用的后台任务是
    在范围内可见 仅限doInBackground方法。没变 到这个列表可能会影响到 你的用户界面。

  • 在启动后台线程之前,您正在将JsonArray传递给适配器。如果您的适配器工作正常,则在后台线程开始工作之前,ListView应该完全正常运行。您应该将空的JsonArray传递给ListView,如果要扩展ArrayAdapter,则可以在发布进度方法中使用addItem。

有关Adapter类命名的一些不相关的事情。你称之为createSpecialAdapter。这听起来像一个方法名称,但它是一个类名。尝试使用大写字母启动所有类名,并为它们指定它们所代表的东西的名称,如SpecialAdapter。