3

この問題を解決するstackoverflowに関するいくつかの質問を読んだが、問題を解決できなかった。 recyclerviewはwebviewを表示します。画像の下(RecyclerViewアダプタがスクロール中に間違った値をとる

right behavior

を私はスクロールダウンし、再び最初の位置までスクロールしたときに、間違った値がWebViewの中に表示されます。私の問題は、アダプタは、最初に、(画像の下に)正しい値をロードすることです):

right behavior

私はこの問題は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をグローバル変数として定義しました。ただし、private class EbookHolder extends RecyclerView.ViewHolderの内部に定義する必要があります。 は、それから私はbindEbook(String pg)方法を取り外し、直接public void onBindViewHolder(EbookHolder holder, int position)内部mListWevView を更新:

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

私の質問>>bindEbook(String pg)を呼び出すとrecyclerviewをスクロールするか、それがAndroidのアーキテクチャに関連しているに比べて長い時間がかかるん?

+0

あなたviewholderはwar_Hero @ –

+0

間違っている:あなたは私の詳細を与えることができますか? –

+0

あなたのアダプターのポストを説明してください、ただJISTと同じです。ビューアの中のビューは、位置を維持するために使用されています。 –

答えて

1

いくつかのことを試してください:

1)String pg = mPgs.get(position)logを置きます。どの行がその行の後ろにあるのかを確認してください。

bindEbook()
2)pgの値が入って来ることを確認するためにlogを入れてください。
3)あなたのwebviewが本当にまた、新しいページに

をロードしているだけで見ることがmListWebView.loadDataWithBaseURL()mListWebView.clearHistory()またはmListWebView.loadUrl("about:blank")を置く - 簡単なtextViewwebviewを交換してみてください - あなたが表示されます、webviewまたはadapterで問題となっています。

+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メソッドを読みました。 (Stationsadapterと呼ばれる)私の外RecyclerViewのアダプタでは、私は、内側ViewHolderクラスの結合方法を変更し、今私のRecyclerViewsは、正しいデータを表示

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

(ライン84 1に参照)がadapter.notifyDataHasChangedメソッドを実行します。私はこれがあなたと他の人を助けることを大変願っています

乾杯 ベン