使用 JSON 创建列表 - IndexOutOfBoundsException:索引 0 无效,大小为 0
Creating list using JSON - IndexOutOfBoundsException: Invalid index 0, size is 0
我正在尝试从 instagram api 获取有关特定标签的 json 数据。从我将所有 url 保存到仅具有字符串 url 属性的自定义 class 图像的响应中。在每个 instagram 响应中,它都有大约 20 个媒体文件,但我似乎无法构建要在回收站视图中显示的图像列表
response.enqueue(新回调() {
@覆盖
public void onResponse(Call call, Response response) {
如果 (response.isSuccess()) {
mEditText.setText("secces");
StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.body().byteStream()));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
JSONObject tagResponse = new JSONObject(sb.toString());
for (int i = 0; i < tagResponse.length(); i++) {
JSONObject pagination = tagResponse.getJSONObject("pagination");
mMaxId = pagination.getString("next_max_id");
mMinId= pagination.getString("next_min_id");
JSONObject meta = tagResponse.getJSONObject("meta");
JSONArray data = tagResponse.getJSONArray("data");
for (int j = 0; j < data.length(); j++) {
JSONArray tags = data.getJSONObject(j).getJSONArray("tags");
JSONObject images = data.getJSONObject(j).getJSONObject("images").getJSONObject("low_resolution");
mEditText.setText(images.getString("url"));
Picture picture = new Picture();
picture.setURL(images.getString("url"));
mAdapter.addImage(picture);
}
}
//displayResults(data);
} catch (Exception e) {
e.printStackTrace();
}
//Log.d(TAG, "CallonResponse isSuccess " + sb.toString() + " ----- ");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//Log.d(TAG, "CallonResponse onFailure! " + t.getMessage());
t.printStackTrace();
}
});
当我执行以下几行时...
Picture picture = new Picture();
picture.setURL(images.getString("url"));
mAdapter.addImage(picture);
根据我的调试技巧,我可以得到images.getString("url")
我觉得无论是创建图片都存在一些问题,但这没有意义,因为所有图片 class 都有一个属性,所以 addImage 中可能存在问题。下面我发布了我的适配器的代码...
public class ImageAdapter 扩展 RecyclerView.Adapter {
private List<Picture> mPictures;
public ImageAdapter(){
mPictures = new ArrayList<>();
}
@Override
public Holder onCreateViewHolder(ViewGroup viewGroup, int i) {
View row = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.sample_layout, viewGroup, false);
return new Holder(row);
}
@Override
public void onBindViewHolder(Holder holder, int i) {
Picture currPic = mPictures.get(i);
Picasso.with(holder.itemView.getContext()).load(currPic.getURL()).into(holder.mPhoto1);
}
@Override
public int getItemCount() {
return 600;
}
public void addImage(Picture picture) {
mPictures.add(picture);
}
public class Holder extends RecyclerView.ViewHolder{
private ImageView mPhoto1, mPhoto2;
public Holder(View itemView) {
super(itemView);
mPhoto1 = (ImageView)itemView.findViewById(R.id.image1);
//mPhoto2 = (ImageView)itemView.findViewById(R.id.image2);
}
}
}
/编辑:
这段代码在我的主 activity 最底部,它设置了视图...它适用于不同的项目,所以我认为这也是我设置它的方式
private void configViews() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//mLayoutManager = new StaggeredGridLayoutManager(VR_SPAN_COUNT, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
// mAdapter = new ImageAdapter();
// mRecyclerView.setAdapter(mAdapter);
}
由于您有 600 个硬编码项目,recyclerview 想要显示这些项目并要求第一个元素 (0)
Picture currPic = mPictures.get(i);
然后抛出异常,因为你没有图片。
@Override
public int getItemCount() {
return mPictures.size();
}
和
mAdapter.addImage(picture);
recyclerView.notifyItemInserted(adapter.getItemCount()-1)
应该做正确的事
问题是您使用空数组 mPictures 创建适配器。
您必须执行以下操作:
在您的 activity/fragment 中,您必须创建图片列表,例如:
List<Picture> mPictures = new ArrayList<Picture>;
并且当你迭代你的响应(数据)时,你必须使用
mPictures.add(picture);
而不是 mAdapter.addImage(picture);
循环后,您必须创建适配器 ImageAdapter mAdapter = new ImageAdapter(mPictures);
并将其设置为 Recycler 视图 - mRecyclerView.setAdapter(mAdapter);
。
您还必须像这样更改您的适配器构造函数:
public ImageAdapter(List<Picture> pictures){
mPictures = pictures;
}
适配器中的 getItemCount() 方法必须如下所示:
@Override
public int getItemCount() {
return mPictures.size();
}
不再需要适配器中的 addImage() 方法。就这些了。
我正在尝试从 instagram api 获取有关特定标签的 json 数据。从我将所有 url 保存到仅具有字符串 url 属性的自定义 class 图像的响应中。在每个 instagram 响应中,它都有大约 20 个媒体文件,但我似乎无法构建要在回收站视图中显示的图像列表
response.enqueue(新回调() { @覆盖 public void onResponse(Call call, Response response) { 如果 (response.isSuccess()) {
mEditText.setText("secces");
StringBuilder sb = new StringBuilder();
try {
BufferedReader reader = new BufferedReader(new InputStreamReader(response.body().byteStream()));
String line;
while ((line = reader.readLine()) != null) {
sb.append(line);
}
JSONObject tagResponse = new JSONObject(sb.toString());
for (int i = 0; i < tagResponse.length(); i++) {
JSONObject pagination = tagResponse.getJSONObject("pagination");
mMaxId = pagination.getString("next_max_id");
mMinId= pagination.getString("next_min_id");
JSONObject meta = tagResponse.getJSONObject("meta");
JSONArray data = tagResponse.getJSONArray("data");
for (int j = 0; j < data.length(); j++) {
JSONArray tags = data.getJSONObject(j).getJSONArray("tags");
JSONObject images = data.getJSONObject(j).getJSONObject("images").getJSONObject("low_resolution");
mEditText.setText(images.getString("url"));
Picture picture = new Picture();
picture.setURL(images.getString("url"));
mAdapter.addImage(picture);
}
}
//displayResults(data);
} catch (Exception e) {
e.printStackTrace();
}
//Log.d(TAG, "CallonResponse isSuccess " + sb.toString() + " ----- ");
}
}
@Override
public void onFailure(Call<ResponseBody> call, Throwable t) {
//Log.d(TAG, "CallonResponse onFailure! " + t.getMessage());
t.printStackTrace();
}
});
当我执行以下几行时...
Picture picture = new Picture();
picture.setURL(images.getString("url"));
mAdapter.addImage(picture);
根据我的调试技巧,我可以得到images.getString("url") 我觉得无论是创建图片都存在一些问题,但这没有意义,因为所有图片 class 都有一个属性,所以 addImage 中可能存在问题。下面我发布了我的适配器的代码...
public class ImageAdapter 扩展 RecyclerView.Adapter {
private List<Picture> mPictures;
public ImageAdapter(){
mPictures = new ArrayList<>();
}
@Override
public Holder onCreateViewHolder(ViewGroup viewGroup, int i) {
View row = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.sample_layout, viewGroup, false);
return new Holder(row);
}
@Override
public void onBindViewHolder(Holder holder, int i) {
Picture currPic = mPictures.get(i);
Picasso.with(holder.itemView.getContext()).load(currPic.getURL()).into(holder.mPhoto1);
}
@Override
public int getItemCount() {
return 600;
}
public void addImage(Picture picture) {
mPictures.add(picture);
}
public class Holder extends RecyclerView.ViewHolder{
private ImageView mPhoto1, mPhoto2;
public Holder(View itemView) {
super(itemView);
mPhoto1 = (ImageView)itemView.findViewById(R.id.image1);
//mPhoto2 = (ImageView)itemView.findViewById(R.id.image2);
}
}
}
/编辑:
这段代码在我的主 activity 最底部,它设置了视图...它适用于不同的项目,所以我认为这也是我设置它的方式
private void configViews() {
mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);
//mLayoutManager = new StaggeredGridLayoutManager(VR_SPAN_COUNT, StaggeredGridLayoutManager.VERTICAL);
mRecyclerView.setHasFixedSize(true);
mRecyclerView.setRecycledViewPool(new RecyclerView.RecycledViewPool());
mRecyclerView.setLayoutManager(mLayoutManager);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getApplicationContext(), LinearLayoutManager.VERTICAL, false));
// mAdapter = new ImageAdapter();
// mRecyclerView.setAdapter(mAdapter);
}
由于您有 600 个硬编码项目,recyclerview 想要显示这些项目并要求第一个元素 (0)
Picture currPic = mPictures.get(i);
然后抛出异常,因为你没有图片。
@Override
public int getItemCount() {
return mPictures.size();
}
和
mAdapter.addImage(picture);
recyclerView.notifyItemInserted(adapter.getItemCount()-1)
应该做正确的事
问题是您使用空数组 mPictures 创建适配器。
您必须执行以下操作:
在您的 activity/fragment 中,您必须创建图片列表,例如:
List<Picture> mPictures = new ArrayList<Picture>;
并且当你迭代你的响应(数据)时,你必须使用
mPictures.add(picture);
而不是 mAdapter.addImage(picture);
循环后,您必须创建适配器 ImageAdapter mAdapter = new ImageAdapter(mPictures);
并将其设置为 Recycler 视图 - mRecyclerView.setAdapter(mAdapter);
。
您还必须像这样更改您的适配器构造函数:
public ImageAdapter(List<Picture> pictures){
mPictures = pictures;
}
适配器中的 getItemCount() 方法必须如下所示:
@Override
public int getItemCount() {
return mPictures.size();
}
不再需要适配器中的 addImage() 方法。就这些了。