Android 滚动到下一页时单击时出错
我已经成功地获得了帖子,在前10篇帖子中,我也获得了帖子内容,但是当我向下滚动加载更多帖子时,我也可以看到带有特色图片的帖子,但是当我点击这些帖子时,我得到了这个错误:现在距离我找到答案已经有两个多星期了,请帮助Android 滚动到下一页时单击时出错,android,arraylist,android-recyclerview,retrofit2,onscrolllistener,Android,Arraylist,Android Recyclerview,Retrofit2,Onscrolllistener,我已经成功地获得了帖子,在前10篇帖子中,我也获得了帖子内容,但是当我向下滚动加载更多帖子时,我也可以看到带有特色图片的帖子,但是当我点击这些帖子时,我得到了这个错误:现在距离我找到答案已经有两个多星期了,请帮助 Caused by: java.lang.IndexOutOfBoundsException: Index: 11, Size: 10 at java.util.ArrayList.get(ArrayList.java:437) at com.punj
Caused by: java.lang.IndexOutOfBoundsException: Index: 11, Size: 10
at java.util.ArrayList.get(ArrayList.java:437)
at com.punjabidharti.myapplication.PostDetails.onCreate(PostDetails.java:30)
这是我的PostDetails活动:
Intent i = getIntent();
int position = i.getExtras().getInt("itemPosition");
Log.e("PostDetails ", "title is " + MainActivity.mListPost.get(position).getTitle().getRendered());
this.title = (TextView) findViewById(R.id.title);
title.setText(Html.fromHtml(MainActivity.mListPost.get(position).getTitle().getRendered()));
String data = String.valueOf((Html.fromHtml(MainActivity.mListPost.get(position).getContent().getRendered())));
WebView webview = (WebView)this.findViewById(R.id.postwebview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadData(data, "text/html; charset=utf-8", "UTF-8");
这是适配器:
private ArrayList<Model> dataset;
private Context mContext;
int total_types;
public RecyclerViewAdapter(ArrayList<Model> mlist, Context context) {
this.dataset = mlist;
this.mContext = context;
total_types = dataset.size();
}
@Override
public int getItemCount() {
return dataset.size();
}
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);
//at the moment, it is displaying an icon for all posts
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 int getItemViewType(int position) {
return position;
}
@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 );
Glide.with(mContext)
.load(object.Image)
.dontAnimate()
.placeholder(R.drawable.icon)
.into(((ImageTypeViewHolder) holder).imageView);
( (ImageTypeViewHolder) 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);
}
});
( (ImageTypeViewHolder) 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);
}
});
( (ImageTypeViewHolder) holder).imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(mContext, PostDetails.class);
intent.putExtra("itemPosition", position);
mContext.startActivity(intent);
}
});
/// dataset.get(position)
}
@Override
public long getItemId(int position) {
return position;
}
私有ArrayList数据集;
私有上下文;
int-total_类型;
公共RecycleServiceAdapter(ArrayList mlist,上下文){
this.dataset=mlist;
this.mContext=上下文;
total_types=dataset.size();
}
@凌驾
public int getItemCount(){
返回dataset.size();
}
公共静态类ImageTypeViewHolder扩展了RecyclerView.ViewHolder{
文本视图标题、副标题;
图像视图图像视图;
公共ImageTypeViewHolder(查看项目视图){
超级(项目视图);
this.title=(TextView)itemView.findViewById(R.id.title);
this.subtitle=(TextView)itemView.findViewById(R.id.subtitle);
//目前,它正在为所有帖子显示一个图标
this.imageView=(imageView)itemView.findViewById(R.id.Icon);
}
}
@凌驾
public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
View=LayoutInflater.from(parent.getContext()).flate(R.layout.postdetails,parent,false);
返回新的ImageTypeViewHolder(视图);
}
@凌驾
public int getItemViewType(int位置){
返回位置;
}
@凌驾
公共无效onBindViewHolder(最终RecyclerView.ViewHolder,最终整型位置){
最终模型对象=dataset.get(位置);
((ImageTypeViewHolder)holder.title.setText(object.title);
((ImageTypeViewHolder)holder.subtitle.setText(object.subtitle);
使用(mContext)滑动
.load(object.Image)
.dontAnimate()
.占位符(R.drawable.图标)
.插入(((ImageTypeViewHolder)holder.imageView);
((ImageTypeViewHolder)holder.title.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
Intent Intent=新的Intent(mContext,postdails.class);
意向。额外(“项目位置”,位置);
mContext.startActivity(意图);
}
});
((ImageTypeViewHolder)holder.subtitle.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
Intent Intent=新的Intent(mContext,postdails.class);
意向。额外(“项目位置”,位置);
mContext.startActivity(意图);
}
});
((ImageTypeViewHolder)holder.imageView.setOnClickListener(新视图.OnClickListener()){
@凌驾
公共void onClick(视图v){
Intent Intent=新的Intent(mContext,postdails.class);
意向。额外(“项目位置”,位置);
mContext.startActivity(意图);
}
});
///dataset.get(位置)
}
@凌驾
公共长getItemId(int位置){
返回位置;
}
这是我的主要活动:
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
progressBar = (ProgressBar) findViewById(R.id.progressbar);
mLayoutManager = new LinearLayoutManager(MainActivity.this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(mLayoutManager);
list = new ArrayList<Model>();
getRetrofit();
adapter = new RecyclerViewAdapter( list, MainActivity.this);
recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy > 0) { //check for scroll down
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();
if (loading) {
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
loading = false;
Log.v("...", "Last Item Wow !");
// Do pagination.. i.e. fetch new data
getRetrofit();
adapter = new RecyclerViewAdapter( list, MainActivity.this);
recyclerView.setAdapter(adapter);
}
}
}
}
});
recyclerView=(recyclerView)findviewbyd(R.id.recycler\u视图);
progressBar=(progressBar)findViewById(R.id.progressBar);
mLayoutManager=新的LinearLayoutManager(MainActivity.this,LinearLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(mLayoutManager);
列表=新的ArrayList();
getReformation();
适配器=新的RecycleServiceAdapter(列表,MainActivity.this);
recyclerView.setAdapter(适配器);
recyclerView.addOnScrollListener(新的recyclerView.OnScrollListener(){
@凌驾
已填空的公共空间(RecyclerView RecyclerView、int dx、int dy){
如果(dy>0){//检查是否向下滚动
visibleItemCount=mLayoutManager.getChildCount();
totalItemCount=mLayoutManager.getItemCount();
pastVisiblesItems=mLayoutManager.findFirstVisibleItemPosition();
如果(装载){
如果((visibleItemCount+pastVisiblesItems)>=totalItemCount){
加载=假;
Log.v(“…”,“最后一项哇!”);
//进行分页..即获取新数据
getReformation();
适配器=新的RecycleServiceAdapter(列表,MainActivity.this);
recyclerView.setAdapter(适配器);
}
}
}
}
});
这是我在Main活动中的改进:
Intent i = getIntent();
int position = i.getExtras().getInt("itemPosition");
Log.e("PostDetails ", "title is " + MainActivity.mListPost.get(position).getTitle().getRendered());
this.title = (TextView) findViewById(R.id.title);
title.setText(Html.fromHtml(MainActivity.mListPost.get(position).getTitle().getRendered()));
String data = String.valueOf((Html.fromHtml(MainActivity.mListPost.get(position).getContent().getRendered())));
WebView webview = (WebView)this.findViewById(R.id.postwebview);
webview.getSettings().setJavaScriptEnabled(true);
webview.loadData(data, "text/html; charset=utf-8", "UTF-8");
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("size", list.size() + "");
System.out.println("The shortest word i is:" + 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).getImages().getMedium()));
adapter.notifyDataSetChanged();
}
progressBar.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onFailure(Call<List<WPPost>> call, Throwable t) {
}
});
}
public void getreformation(){
改装改装=新改装.Builder()
.baseUrl(baseUrl)
.addConverterFactory(GsonConverterFactory.create())
.build();
RefundationArrayAPI服务=Refundation.create(RefundationArrayAPI.class);
字符串yourURl=yourURl.replace(baseURL,“”);
Call=service.getPostInfo(您的URL);
call.enqueue(新回调(){
@凌驾
公共void onResponse(调用、响应){
Log.e(“mainactivyt”,“response”+response.body());
mListPost=response.body();
progressBar.setVisibility(View.GONE);
if(response.body()!=null){
对于(int i=0;i”,”);
tempdetails=tempdetails.replace(“[&hellip;]”,“”);
列表.添加(新模型(Model.IMAGE\u类型,response.body
Log.e("PostDetails ", "title is " + MainActivity.mListPost.get(position).getTitle().getRendered());
public class RecyclerViewTestActivity extends AppCompatActivity {
private MyAdapter adapter;
private boolean loading = false;
int pastVisiblesItems, visibleItemCount, totalItemCount;
LinearLayoutManager mLayoutManager;
String baseURL = "https://my.backend.url";
Retrofit retrofit = new Retrofit.Builder()
.baseUrl(baseURL)
.addConverterFactory(GsonConverterFactory.create())
.build();
RetrofitArrayApi service = retrofit.create(RetrofitArrayApi.class);
String yourURl = yourURL.replace(baseURL,"");
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view_test);
RecyclerView recyclerView = findViewById(R.id.recycler_view);
mLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(mLayoutManager);
adapter = new MyAdapter(new ArrayList<>());
recyclerView.setAdapter(adapter);
recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {
@Override
public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
if (dy > 0) { //check for scroll down
visibleItemCount = mLayoutManager.getChildCount();
totalItemCount = mLayoutManager.getItemCount();
pastVisiblesItems = mLayoutManager.findFirstVisibleItemPosition();
if ((visibleItemCount + pastVisiblesItems) >= totalItemCount) {
Log.d("tisha==>>","Is loading = "+loading);
// Do pagination.. i.e. fetch new data
if (!loading){
adapter.showHideProgress(true);
loading = true;
getRetrofit();
}
}
}
}
});
getRetrofit();
}
void getRetrofit(){
// fetching data from remote server.....
try {
List<Model> list = new ArrayList<>();
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.d("==>>", " response "+ response.body());
mListPost = response.body();
progressBar.setVisibility(View.GONE);
if (response.body() != null) {
for (int i = 0; i < response.body().size(); i++ ) {
Log.d("==>>", list.size() + "");
Log.d("==>>", " 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).getImages().getMedium()));
}
if (loading){
loading = false;
adapter.showHideProgress(false);
}
adapter.addItemsToList(list);
progressBar.setVisibility(View.GONE);
} else {
progressBar.setVisibility(View.GONE);
}
}
@Override
public void onFailure(Call<List<WPPost>> call, Throwable t) {
}
});
}catch (Exception exception){
Log.d("tisha==>>"," "+exception.getLocalizedMessage());
}
}
// Customize Model Class as per your requirement-----------------
class Model implements Parcelable {
String title;
String subTitle;
String imageUrl;
Model(String title, String subTitle, String imageUrl){
this.title = title;
this.subTitle = subTitle;
this.imageUrl = imageUrl;
}
protected Model(Parcel in) {
title = in.readString();
subTitle = in.readString();
imageUrl = in.readString();
}
public static final Creator<Model> CREATOR = new Creator<Model>() {
@Override
public Model createFromParcel(Parcel in) {
return new Model(in);
}
@Override
public Model[] newArray(int size) {
return new Model[size];
}
};
@Override
public int describeContents() {
return 0;
}
@Override
public void writeToParcel(Parcel dest, int flags) {
dest.writeString(title);
dest.writeString(subTitle);
dest.writeString(imageUrl);
}
}
class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder>{
List<Model> modelList;
int viewTypeData = 0,viewTypeProgress = 1;
MyAdapter(List<Model> list){
modelList = list;
}
@NonNull
@Override
public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
mContext = parent.getContext();
if (viewType == viewTypeData){
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_view,parent,false);
return new MyDataHolder(view);
}else {
View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.recycler_item_loading,parent,false);
return new MyProgressHolder(view);
}
}
@Override
public void onBindViewHolder(@NonNull RecyclerView.ViewHolder holder, int position) {
Model model = modelList.get(position);
if (holder instanceof MyDataHolder){
((MyDataHolder)holder).showModel(model);
}else
((MyProgressHolder)holder).show();
}
@Override
public int getItemCount() {
return modelList.size();
}
@Override
public int getItemViewType(int position){
if (modelList.get(position).title.equals("progress"))
return viewTypeProgress;
else
return viewTypeData;
}
void showHideProgress(boolean shouldShowProgress){
if (shouldShowProgress){
modelList.add(new Model("progress","",""));
notifyItemInserted(modelList.size()-1);
}else {
Log.d("tisha==>>","Size before removal = "+modelList.size());
modelList.remove(modelList.size()-1);
notifyItemRemoved(modelList.size()-1);
Log.d("tisha==>>","Size after removal = "+modelList.size());
}
}
void addItemsToList(List<Model> newItems){
if (modelList.isEmpty()){
modelList.addAll(newItems);
notifyDataSetChanged();
Log.d("tisha==>>","First time List size = "+modelList.size());
}else {
int lastItemPosition = modelList.size() -1;
Log.d("tisha==>>","Old list size = "+modelList.size()+ "Last Item position= "+lastItemPosition);
modelList.addAll(newItems);
Log.d("tisha==>>","Update List size = "+modelList.size());
notifyItemRangeInserted(lastItemPosition,newItems.size());
}
}
static class MyDataHolder extends RecyclerView.ViewHolder{
TextView titleView,subTitleView;
ImageView imageView;LinearLayout rootView;
// Use Glide to load image to image view
public MyDataHolder(@NonNull View itemView) {
super(itemView);
titleView = itemView.findViewById(R.id.recycler_item_title_tv);
subTitleView =
itemView.findViewById(R.id.recycler_item_subtitle_tv);
imageView = itemView.findViewById(R.id.recycler_img_view);
rootView = itemView.findViewById(R.id.recycler_item_root_view);
rootView.setOnClickListener(v -> {
Bundle bundle = new Bundle();
bundle.putParcelable("my_key",modelList.get(getAdapterPosition()));
Intent intent = new Intent(mContext, DetialsActivity.class);
intent.putExtra("my_bundle",bundle);
mContext.startActivity(intent);
});
}
void showModel(Model model){
titleView.setText(model.title);
subTitleView.setText(model.subTitle);
}
}
static class MyProgressHolder extends RecyclerView.ViewHolder{
ProgressBar progressBar;
public MyProgressHolder(@NonNull View itemView) {
super(itemView);
progressBar = itemView.findViewById(R.id.recycler_item_progress);
}
void show(){
progressBar.setVisibility(View.VISIBLE);
}
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal"
android:id="@+id/recycler_item_root_view">
<ImageView
android:id="@+id/recycler_img_view"
android:layout_width="50dp"
android:layout_height="50dp"/>
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:orientation="vertical"
android:layout_weight="1"
android:layout_gravity="center_vertical">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recycler_item_title_tv"
android:gravity="center">
</TextView>
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/recycler_item_subtitle_tv"
android:gravity="start">
</TextView>
</LinearLayout>
<ProgressBar
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="50dp"
android:id="@+id/recycler_item_progress"
android:indeterminate="true">
Bundle bundle = getIntent().getBundleExtra("my_bundle");
Model model = bundle.getParcelable("my_key");
if (model != null){
Log.d("tisha==>>","Title = "+model.title);
}