我正在创建一个应用程序,从网络获取一些数据作为JSON,然后它应该显示在列表视图中。
到目前为止,我有一个获取数据并且按预期成功运行的类,然后我有一个自定义的ArrayAdapter类。当我使用soem Log.d()在各个地方运行我的代码以检查代码是否正常工作时,应用程序将打开,下载JSON然后将其发送回我的活动,然后数据被发送到数组适配器成功
(通过调用发送到适配器的数据中第一个JSONObject的字段来测试它。)
据我所知,问题是getView()方法没有被调用。
代码:
try {
listAdapter = new CropListAdapter(this, R.layout.crop_listitem,
crops.getJSONArray("crops"));
listView.setAdapter(listAdapter);
// setUpViews();
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
Adapater:
public class CropListAdapter extends ArrayAdapter<JSONArray> {
Context context;
JSONArray data;
int layoutResourceId;
CropHolder cropHolder;
public CropListAdapter(Context context, int layoutResourceId, JSONArray data) {
super(context, layoutResourceId);
// TODO Auto-generated constructor stub
this.context = context;
this.data = data;
this.layoutResourceId = layoutResourceId;
this.cropHolder = null;
}
@Override
public View getView(int pos, View convertView, ViewGroup parent) {
Log.d("Working", "works here 38");
View row = convertView;
JSONObject crop;
try {
Log.d("Pos", Integer.toString(pos));
crop = (JSONObject) data.getJSONObject(pos);
if (row == null) {
LayoutInflater inflater = ((Activity) context)
.getLayoutInflater();
row = inflater.inflate(layoutResourceId, parent, false);
cropHolder = new CropHolder();
cropHolder.tvCropId = (TextView) row
.findViewById(R.id.tvCropId);
cropHolder.tvCropName = (TextView) row
.findViewById(R.id.tvCropName);
cropHolder.ivCropImage = (ImageView) row
.findViewById(R.id.ivCropImage);
row.setTag(cropHolder);
} else {
cropHolder = (CropHolder) row.getTag();
}
cropHolder.tvCropId.setText(crop.getString("crop_id"));
cropHolder.tvCropName.setText(crop.getString("name"));
Log.d("Item", "creating item " + crop.getString("name"));
} catch (JSONException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return row;
}
static class CropHolder {
TextView tvCropName;
ImageView ivCropImage;
TextView tvCropId;
}
}
答案 0 :(得分:0)
我看不到你在哪里覆盖getCount()
方法,你的列表适配器返回0作为列表中元素的数量,你需要覆盖它并返回JSONArray中元素的数量
答案 1 :(得分:0)
如果认为在这种情况下应该覆盖BaseAdapter
。顺便说一句,如果你想要调用getView()
,你必须覆盖getCount()
并让它返回data. length()
答案 2 :(得分:0)
首先,执行此操作并不是一个好主意“crops.getJSONArray(”crop“)”,似乎是,您正在下载带有同步调用的jsonArray。如果它是同步的,那么应用程序将在较新的Android版本上崩溃。您必须执行Asynchonously下载任务,完成后必须通知适配器数据已更新。它将刷新列表。
在GetView方法中解析json也是一个坏主意,如果你没有正确处理异常,它会影响listview的平滑滚动并使你的应用程序崩溃。在下载并解析之后,您应该将json数据加载到某些数据结构中。然后您可以在getView中使用它们。
在这种情况下,您应该通过扩展BaseAdapter来制作适配器,它更容易,更可定制,这就是为什么在所有情况下都能很好地工作。
希望这有帮助。
答案 3 :(得分:0)
试试这个
getView()方法中的
LayoutInflater inflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
row = inflater.inflate(layoutResourceId,null);