我想用 json api 和 WordPress 作为后端制作应用程序。我可以获取帖子并且它可以正常工作直到第一页,当我点击每个帖子时,我也可以看到帖子详细信息,但是在下一页的帖子中,点击不起作用并且应用程序崩溃,我得到的错误是:
java.lang.RuntimeException: Unable to start activity ComponentInfo{com.punjabidharti.myapplication/com.punjabidharti.myapplication.PostDetails}: java.lang.IndexOutOfBoundsException: Index: 10, Size: 10
这是适配器...
private ArrayList<Model> dataset;
private Context mContext;
int total_types;
public RecyclerViewAdapter(ArrayList<Model> mlist, Context context) {
this.dataset = mlist;
this.mContext = context;
}
public static class ImageTypeViewHolder extends RecyclerView.ViewHolder {
TextView title, subtitle;
ImageView imageView;
public ImageTypeViewHolder (View itemView) {
super(itemView);
this.title = (TextView) itemView.findViewById(R.id.title);
this.subtitle = (TextView) itemView.findViewById(R.id.subtitle);
this.imageView = (ImageView) itemView.findViewById(R.id.icon);
}
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.postdetails, parent, false);
return new ImageTypeViewHolder(view);
}
@Override
public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
final Model object = dataset.get(position);
( (ImageTypeViewHolder) holder).title.setText(object.title);
( (ImageTypeViewHolder) holder).subtitle.setText(object.subtitle);
( (ImageTypeViewHolder) holder).title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent (mContext, PostDetails.class);
intent.putExtra ("itemPosition", position);
mContext.startActivity(intent);
}
});
( (ImageTypeViewHolder) holder).subtitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent = new Intent (mContext, PostDetails.class);
intent.putExtra ("itemPosition", position);
mContext.startActivity(intent);
}
});
}
@Override
public int getItemViewType(int position) {
return position;
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public int getItemCount() {
return dataset.size();
}
这就是我在滚动时加载下一页的方式..
recyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(mLayoutManager) {
@Override
public void onLoadMore(int current_page) {
// do something...
yourURL = "https://punjabidharti.com/wp-json/wp/v2/posts/?categories=4514&per_page=10&page=2";
getRetrofit();
}
});
这就是我通过改造获取帖子的方式..
public void getRetrofit(){
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitArrayApi service = retrofit.create(RetrofitArrayApi.class);
String yourURl = yourURL.replace(baseURL,"");
Call<List<WPPost>> call = service.getPostInfo( yourURl);
call.enqueue(new Callback<List<WPPost>>() {
@Override
public void onResponse(Call<List<WPPost>> call, Response<List<WPPost>> response) {
Log.e("mainactivyt", " response "+ response.body());
mListPost = response.body();
progressBar.setVisibility(View.GONE);
if (response.body() != null) {
for (int i = 0; i < response.body().size(); i++) {
Log.e("main ", " title " + response.body().get(i).getTitle().getRendered() + " " +
response.body().get(i).getId());
String tempdetails = response.body().get(i).getExcerpt().getRendered().toString();
tempdetails = tempdetails.replace("<p>", "");
tempdetails = tempdetails.replace("</p>", "");
tempdetails = tempdetails.replace("[…]", "");
list.add(new Model(Model.IMAGE_TYPE, response.body().get(i).getTitle().getRendered(),
tempdetails,
response.body().get(i).getLinks().getWpFeaturedmedia().get(0).getHref()));
}
progressBar.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.GONE);
}
adapter.notifyDataSetChanged();
}
@Override
public void onFailure(Call<List<WPPost>> call, Throwable t) {
}
});
答案 0 :(得分:0)
将 Adapter 和 ArrayList 更改为 List。
public class ImageTypeViewHolder extends RecyclerView.Adapter<ImageTypeViewHolder.ViewHolder> {
private List<Model> dataset;
private Context mContext;
int total_types;
public ImageTypeViewHolder(List<Model> mlist, Context context) {
this.dataset = mlist;
this.mContext = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.postdetails, parent, false);
return new ImageTypeViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.title.setText(dataset.get(position).getTitle());
holder.subtitle.setText(dataset.get(position).getSubTitle());
holder.title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent (mContext, PostDetails.class);
intent.putExtra ("itemPosition", position);
mContext.startActivity(intent);
}
});
holder.subtitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent (mContext, PostDetails.class);
intent.putExtra ("itemPosition", position);
mContext.startActivity(intent);
}
});
}
@Override
public int getItemCount() {
return dataset.size();
}
public static class ViewHolder extends RecyclerView.ViewHolder{
TextView title, subtitle;
ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
this.title = (TextView) itemView.findViewById(R.id.title);
this.subtitle = (TextView) itemView.findViewById(R.id.subtitle);
this.imageView = (ImageView) itemView.findViewById(R.id.icon);
}
}
}
答案 1 :(得分:0)
试试这个
public class ImageTypeViewHolder extends RecyclerView.Adapter<ImageTypeViewHolder.ViewHolder> {
private List<Model> dataset;
private Context mContext;
public ImageTypeViewHolder(List<Model> mlist, Context context) {
this.dataset = mlist;
this.mContext = context;
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.postdetails, parent, false);
return new ViewHolder(view);
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.setData(dataset.get(position).getTitle(),dataset.get(position).getSubTitle());
}
@Override
public int getItemCount() {
return dataset.size();
}
class ViewHolder extends RecyclerView.ViewHolder{
TextView title, subtitle;
ImageView imageView;
public ViewHolder(@NonNull View itemView) {
super(itemView);
this.title = (TextView) itemView.findViewById(R.id.title);
this.subtitle = (TextView) itemView.findViewById(R.id.subtitle);
this.imageView = (ImageView) itemView.findViewById(R.id.icon);
}
private void setData(String title, String subtitle){
this.title.setText(title);
this.subtitle.setText(subtitle);
}
title.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent (mContext, PostDetails.class);
intent.putExtra ("itemPosition", position);
itemView.getContext().startActivity(intent);
}
});
subtitle.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent (mContext, PostDetails.class);
intent.putExtra ("itemPosition", position);
itemView.getContext().startActivity(intent);
}
});
}
}