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顯示正確的數據。我非常希望這可以幫助你和其他人。

乾杯 本