Android 在滚动期间,RecyclerView适配器使用了错误的值

Android 在滚动期间,RecyclerView适配器使用了错误的值,android,webview,android-recyclerview,android-adapter,android-viewholder,Android,Webview,Android Recyclerview,Android Adapter,Android Viewholder,我已经阅读了有关stackoverflow解决此问题的几个问题,但我无法解决我的问题。recyclerview显示网络视图。我的问题是适配器最初加载正确的值(下图): 但当我向下滚动并再次向上滚动到第一个位置时,webview中会显示错误的值(下图): 我认为这个问题可能源于以前开始加载到webview,但我不知道如何处理这个行为。以下是我的代码的相关部分: /* in my notation, pg is equivalent to page.*/ @Override public Vie

我已经阅读了有关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();
}
}

我的问题>>调用
bindEbook(String pg)
是否比滚动recyclerview花费更长的时间,或者它与Android架构有关???

请尝试几件事:

1) 在
字符串pg=mPgs.get(位置)
之后放置
log
;看,哪个
pg
值在那行后面

bindEbook()

2) 放入
log
查看传入的
pg

3) 将
mListWebView.clearHistory()
mListWebView.loadUrl(“关于:空白”)
放在
mListWebView.loadDataWithBaseURL()
之前,看看你的
webview
真的在加载新页面吗


另外-尝试用简单的
textView
替换
webview
-您将看到,
webview
adapter
中存在问题。我遇到了一个非常类似的问题,经过大量调试后解决了这个问题。我希望这能帮助您:

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

我注意到,当向下滚动外部(垂直)RecyclerView时,内部(水平)RecyclerView的值被弄乱了。这与你的问题相似。在我的内部RecyclerView适配器(称为MeasurementsAdapter)中到处设置一些控制台日志命令(log.v),特别是在内部视图持有者类中,其中的一个命令绑定了数据: 公共类MeasurementsViewHolder扩展了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
}
现在我的RecyclerViews显示了正确的数据。我非常希望这能帮助你和其他人

干杯
Ben

你的视窗夹错了@war\u Hero:你能给我更多的细节吗?发布你的适配器我会解释,就像JIST一样,视窗夹内的视图用于保持位置它需要更多的内存,因为项目不可回收谢谢你的帮助回答。我找到了解决方案。我删除了
bindEbook(字符串pg)
和在
onBindViewHolder
方法中直接更新webview。(1)和(2)是解决问题的关键点。(3)没有效果。问题在适配器中。再次感谢。
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
}
   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();
   }