我正在尝试逐个添加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方法中也没有显示它。
答案 0 :(得分:1)
肯定有问题 使用适配器。你永远不应该 保存应显示在的视图 ListView自己。只保存 创建数据所需的数据 查看并覆盖getView方法 您的适配器创建所需的 视图。
第二件事就是你的名单
正在使用的后台任务是
在范围内可见
仅限doInBackground方法。没变
到这个列表可能会影响到
你的用户界面。
在启动后台线程之前,您正在将JsonArray传递给适配器。如果您的适配器工作正常,则在后台线程开始工作之前,ListView应该完全正常运行。您应该将空的JsonArray传递给ListView,如果要扩展ArrayAdapter,则可以在发布进度方法中使用addItem。
有关Adapter类命名的一些不相关的事情。你称之为createSpecialAdapter。这听起来像一个方法名称,但它是一个类名。尝试使用大写字母启动所有类名,并为它们指定它们所代表的东西的名称,如SpecialAdapter。