3

我已经阅读了几个关于stackoverflow解决这个问题的问题,但是我无法解决我的问题。 recyclerview显示网页浏览。我的问题是,适配器,最初,加载正确的价值观(下图):RecyclerView适配器在滚动期间采取错误的值

right behavior

但是当我向下滚动,并且再次滚动到第一位置,错误值显示在网页视图(如下图):

right behavior

我觉得这个问题可以从以前开始加载源自到web视图,但我没有怎样处理这个问题的任何想法。这里是我的代码的相关部分:

/* 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定义为全局变量。但它应该在private class EbookHolder extends RecyclerView.ViewHolder内定义。 然后我删除bindEbook(String pg)方法,直接更新mListWevViewpublic void onBindViewHolder(EbookHolder holder, int position)

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

我的问题>>是否调用bindEbook(String pg)相比,滚动recyclerview或它关系到Android的架构需要更长的时间?

+0

您viewholder是错误的 –

+0

@ war_Hero:你能不能给我更多的细节? –

+0

发布您的适配器生病的解释,只是作为一个JIST在视图内的视图内部被用来维持位置 –

回答

1

请再试几件事情:

1)把logString pg = mPgs.get(position)后;并看到,其中pg值是在该行之后;

bindEbook()
2)把log看看哪个pg值是传入的;
3)把mListWebView.clearHistory()mListWebView.loadUrl("about:blank")mListWebView.loadDataWithBaseURL()之前只是看你的webview真正加载新的页面

而且 - 尝试用简单的textView更换webview - 你会看到,在webviewadapter问题。

+0

谢谢你有用的答案。我找到解决方案。我删除了'bindEbook(String pg)',并在'onBindViewHolder'方法中直接更新了webview。 (1)和(2)是解决问题的关键。 (3)没有效果。问题在于适配器。再次感谢你。 –

0

我有一个非常类似的问题,我经过广泛的调试后解决了。我希望这可以帮助你:

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

我注意到,当滚动外部(垂直)RecyclerView时,内部(水平)RecyclerView的值在哪里搞砸了。这与你的问题类似。在我的内部RecyclerView适配器(称为MeasurementsAdapter)中设置一些控制台日志命令(Log.v),其中一个专门用于内部视图持有者类,其中绑定了数据: public class 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 
} 

我观察到当我在某一点滚动不再执行这个“bindMeasurement”的方法。

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

因此,在阅读RecyclerView文档中的notifyDataSetChanged方法后。在我的外RecyclerView(称为Stationsadapter)的适配器我在内部ViewHolder类改性的结合方法和执行该方法adapter.notifyDataHasChanged那里(见线84在1

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显示正确的数据。我非常希望这可以帮助你和其他人。

干杯 本