当前位置: 首页 > 知识库问答 >
问题:

RecyclerView适配器在滚动期间获取了错误的值

狄誉
2023-03-14

我在stackoverflow上读到了几个解决这个问题的问题,但我无法解决我的问题。recyclerview显示网络视图。我的问题是适配器最初加载了正确的值(下图):

但当我向下滚动并再次向上滚动到第一个位置时,webview中会显示错误的值(下图):

我认为这个问题可能源于之前开始加载到webview 中,但我不知道如何处理此行为。以下是我的代码的相关部分:

/* in my notation, pg is equivalent to page.*/
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.fragment_ebook_list, container, false);
mEbookRecyclerView = (RecyclerView) view.findViewById(R.id.ebook_recycler_view);
mLayoutManager = new LinearLayoutManager(getActivity());
mEbookRecyclerView.setLayoutManager(mLayoutManager);
updateUI();
return view;
}

@Override
public void onResume() {
super.onResume();
updateUI();
}


private void updateUI() {
if (mAdapter == null) {
    EbookLab ebookLab = EbookLab.get(getActivity());
    List<String> pgs = ebookLab.getPgs();
    mAdapter = new EbookAdapter(pgs);
    mEbookRecyclerView.setAdapter(mAdapter);
}
}

   /* ******codes for preparation of menus which I have ignored *******/

private class EbookHolder extends RecyclerView.ViewHolder {
private String mPg;

public EbookHolder(LayoutInflater inflater, ViewGroup container) {
    super(inflater.inflate(R.layout.list_item_ebook, container, false));
    mListWebView = (WebView) itemView.findViewById(R.id.list_web_View);
    mListWebView.getSettings().setLoadWithOverviewMode(true);
}

public void bindEbook(String pg) {
    mPg = pg;
    mListWebView.loadDataWithBaseURL("file:///android_asset/", "Stack Over Flow " + String.valueOf(glbPos), "text/html", "UTF-8", null);

}
}

private class EbookAdapter extends RecyclerView.Adapter<EbookHolder> {
private List<String> mPgs;
public EbookAdapter(List<String> pgs) {
    mPgs = pgs;
}
@Override
public EbookHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
    LayoutInflater layoutInflater = LayoutInflater.from(getActivity());
    return new EbookHolder(layoutInflater, parent);
}


@Override
public void onBindViewHolder(EbookHolder holder, int position) {
    String pg = mPgs.get(position);
    glbPos = position;//A global variable for position
    holder.bindEbook(pg);
}
@Override
public int getItemCount() {
    return mPgs.size();
}
public void setPgs(List<String> pgs) {
    mPgs.clear();
    mPgs.addAll(pgs);
    notifyDataSetChanged();
}
}

任何帮助是值得赞赏的。

更新:在我的代码中,我将mListWebView定义为一个全局变量。但应该在< code >私有类EbookHolder extends RecyclerView内部定义。ViewHolder。然后我移除了< code>bindEbook(String pg)方法,直接更新了< code > public void onBindViewHolder(ebook holder,int position)内部的< code>mListWevView:

holder.mListWebView.loadDataWithBaseURL("file:///android_asset/", "Stack Over Flow " + String.valueOf(glbPos), "text/html", "UTF-8", null);

我的问题

共有2个答案

万俟旭
2023-03-14

我有一个非常类似的问题,我在广泛调试后解决了这个问题。我希望这能帮助您:

在我的项目中,我在垂直回收视图中显示了一个水平回收视图。代码可以在这里和这里看到,我在我的网站上解释了我的工作。

我注意到,当向下滚动外部(垂直)回收器视图时,内部(水平)回收器视图的值混乱了。这与您的问题相似。在我的内部回收器视图适配器(称为测量器适配器)中到处设置一些控制台日志命令(Log. v),特别是在内部视图持有人类中,其中绑定了数据:公共类测量器视图持有人扩展RecyclerView.ViewHolder{[此处省略代码]

public MeasurementsViewHolder (View itemView) {
    super(itemView);
    [code omitted here]
}

public void bindMeasurement (String name, double value, String unit, int color) {
    mNameView.setText(name);
    mValueView.setText(String.valueOf(Math.round(value)));
    mUnitsView.setText(unit);
    mBoxLayout.setBackgroundColor(color);
    // Log.v(TAG, name + " " + value); <-- here I was logging
}

我观察到,当我在某个时候滚动时,这个“bind量测”方法不再执行。

我的猜测是回收人员视图正在“回收”一些随机数据。这不是我想要的,我的结果看起来很像你的。

因此,在我阅读了RecyclerView文档中的notifyDataSetChanged方法之后。在外部RecyclerView的适配器(称为StationAdapter)中,我修改了内部ViewHolder类中的绑定方法并执行了适配器。notifyDataHasChanged方法(参见1中的第84行)

   public class StationsViewHolder extends RecyclerView.ViewHolder
       implements View.OnClickListener {public TextView mStationInfoView;
   private MeasurementsAdapter mMeasurementsAdapter;

   /**
    * Constructor of inner class StationsViewHolder
    * @param itemView
    */
   public StationsViewHolder(View itemView) {
       super(itemView);
       [code omitted here]

   }

   /**
    * Bind weather station to view
    * @param station is a class containing data of one weather station
    */
   public void bindStation (Station station) {
       [code omitted here]
       mMeasurementsAdapter.notifyDataSetChanged();
   }

现在我的RecyclerViews显示了正确的数据。我非常希望这能帮助你和其他人。

干杯本

魏冷勋
2023-03-14

请尝试几件事:< br>
1)将< code>log放在< code > String pg = mpgs . get(position)之后;看看那一行之后是哪个< code>pg值;< br>
在< code>bindEbook()中:< br> 2)放置< code>log以查看哪个< code>pg值正在传入;< br> 3)将< code > mlist webview . clear history()或< code > mlist webview . loadurl(" about:blank ")放在< code > mlist webview . loaddatawithbaseurl()之前,以查看您的< code>webview是否真正加载了新页面

另外 - 尝试用简单的文本视图替换webview - 你会看到,在webview适配器中是有问题的。

 类似资料:
  • 我想为使用动画,但当为使用动画时,强制关闭我的应用程序并显示上下文错误即使我不能在适配器中使用toast如何在适配器中使用动画并解决上下文问题,我放了我的代码,如何能解决我的问题或适配器?请帮助我 我的错误

  • AdapterClass: 提前感谢你的帮助。

  • 在旧代码中,当我使用与自定义适配器时,我可以使用此代码获取项目。 现在我正在实现。如何从<代码>回收视图中获取项目。适配器?

  • 我有一个使用RecyclerView的列表,我想要的是,当我点击列表项时,它会打开一个片段,我一直在搜索,我只在一个活动中找到了它,但我只在片段中工作,如果我使用活动,它会随着我的操作栏消失,它都在片段中设置。 这是我的适配器类: 我需要将信用卡id发送到片段,调用控制器并从数据库中获取信息,我尝试了使用intent,但只有在使用startActivity(intent)调用活动时才有效。 这里是

  • 在中,我需要更改每个行列表中的,即在选择每个位置后才指定的行更改。 所有的事情都是正确的,但当滚动回收视图,所选行的位置会自动改变! 这是我的适配器类: 我在输出中看到的: 正如所看到的,我选择了第一行图标,但滚动RecyclerView后,选择的位置改变了。 然后尝试使用更改和在中的位置再次错误! 我也看到了这个解决方案:获取点击的项目及其在RecyclerView中的位置

  • 我已经提到了相当少的帖子关于这个错误,但没有一个能够解决我的问题。我有一个片断,在这里我使用修改获得了我的值,我已经在下面显示了: 下面是我的RecyclerView适配器类: