【问题标题】:Getting Error When loaded next posts on Scroll RecycleView在 Scroll RecyclerView 上加载下一篇文章时出现错误
【发布时间】:2021-06-24 15:48:03
【问题描述】:

我非常需要你的帮助,我已经工作了一个多星期仍然找不到解决方案。我使用 json api Retrofit 和 Wordpress 作为后端制作应用程序,前 10 个帖子工作顺利,当我点击那些帖子我可以看到帖子详细信息,但是当我滚动以获取更多帖子时,我可以看到带有特色图片的帖子,但是当我点击它时,我看到了这个错误:

Caused by: java.lang.IndexOutOfBoundsException: Index: 10, Size: 10
at java.util.ArrayList.get(ArrayList.java:437)
at com.punjabidharti.myapplication.PostDetails.onCreate(PostDetails.java:30)

这就是我在滚动上获得更多帖子的方式

recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() {

        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
        }
        @Override
        public void onScrolled(RecyclerView recyclerView, int position, 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

                        yourURL = "https://punjabidharti.com/wp-json/wp/v2/posts/?categories=4514&page=2";
                        getRetrofit();

                         loading = true;
                    }
                }
            }
        }
    });

这就是我从改造中获取数据的方式:我使用动态网址

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("[&hellip;]", "");
                    list.add(new Model(Model.IMAGE_TYPE, response.body().get(i).getTitle().getRendered(),
                            tempdetails,
                            response.body().get(i).getLinks().getWpAttachment().get(0).getHref()));
                }

                progressBar.setVisibility(View.GONE);
            } else {
                progressBar.setVisibility(View.GONE);
            }


            adapter.notifyDataSetChanged();
        }
        @Override
        public void onFailure(Call<List<WPPost>> call, Throwable t) {
        }
    });

这是适配器中的 bindviewholder

 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)
}

这是 PostDetails 类

  @Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.post);
    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");

我在 Debug 中发现了这个错误:

请帮忙

【问题讨论】:

标签: android android-recyclerview retrofit onscroll


【解决方案1】:

您是说列表中的 10 项显示没有任何问题。从 0 到 9 的索引似乎已满。但是,当您尝试访问索引 10 时,您将得到 IndexOutOfBoundsException。

在这种情况下,您的列表中的项目不得超过 10 个。因此,您的列表可能无法正确加载。请首先检查您正在使用 list.get() 方法的列表的目录。如下:

if (index < myList.size()) (
    // there is a index
} else {
     // index does not exist
}

你可以在“else”步骤中添加一个日志来查看错误在哪里。


我认为您可以将示例中的库用于您尝试使用的结构。我以前没有使用过这个库,我不承担任何责任。我推荐你的研究。 https://github.com/pwittchen/InfiniteScroll


你也可以试试下面的代码吗?否则我建议调试 OnCreate 方法,以防代码在你的人身上运行。

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.post);

    this.title = (TextView) findViewById(R.id.title);
    WebView webview = (WebView)this.findViewById(R.id.postwebview);
    webview.getSettings().setJavaScriptEnabled(true);

    Intent i = getIntent();
    int position = i.getExtras().getInt("itemPosition");

    if (position < MainActivity.mListPost.size()) {

        WPPost post = MainActivity.mListPost.get(position);

        title.setText(Html.fromHtml(post.getTitle().getRendered()));
        
        String data = String.valueOf((Html.fromHtml(post.getContent().getRendered()))); 
        webview.loadData(data, "text/html; charset=utf-8", "UTF-8");
    } else {
        Log.e("PostDetails", "No index. List size: " + MainActivity.mListPost.size());
    }
}

【讨论】:

  • 我可以看到所有帖子,即使我滚动我也可以看到新帖子,但是当我点击第 11 个帖子时,我得到了那个错误
  • 你能分享一下 PostDetails 类吗?至少 onCreate() 方法。
  • 我更新了我的答案。你可以试试我在 PostDetails 上发布的 onCreate 部分吗?
  • 仍然是同样的问题原因:java.lang.IndexOutOfBoundsException:索引:11,大小:com.punjabidharti.myapplication 的 java.util.ArrayList.get(ArrayList.java:437) 的 10。 PostDetails.onCreate(PostDetails.java:33)
  • 我们没有删除控件之前的日志记录代码。我更新了答案。你也可以做最后的改变吗?
猜你喜欢
  • 1970-01-01
  • 2013-03-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-14
  • 1970-01-01
  • 2022-11-13
  • 2018-07-22
相关资源
最近更新 更多