3

RecyclerView.Adapter を拡張するカスタム アダプターを使用して RecyclerView を使用しています。

実行時にTextviewでLinearLayoutを作成し、RecyclerViewの各行で膨らませています

たとえば、RecyclerView の 1 行目には実行時に作成された 2 つまたは 3 つの Textview があり、2 行目には実行時に作成された 2 つまたは 3 つの Textview があり、3 行目にはいくつかの Textview があります...など...

ログを確認すると、ほぼ完全に動作します...しかし、下にスクロールすると、テキストビューが間違った場所に配置されるだけです。つまり、間違った場所にスクロールすると、以前のテキストビューが再び取得されます

@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
    //Movie movie = mItems.get(i);
    hm2 = new HashMap<String, ArrayList<PD_Data>>();
    sub_rows2 = new ArrayList<PD_Data>();
    hm2=categories.get(i);
    String key=hm2.keySet().toArray()[0].toString();
    sub_rows2=hm2.get(key);

    Log.i(LOG_TKT,key);

    viewHolder.textview_category.setText(key);

    LayoutInflater inflater;
    View new_sub_row;

    for(int x=0;x<sub_rows2.size();x++){
        inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        new_sub_row = inflater.inflate(R.layout.recyclerview_pd, null);
        TextView heading2 = (TextView)new_sub_row.findViewById(R.id.heading2);
        heading2.setText(sub_rows2.get(x).sub_heading);
        Log.i(LOG_TKT,sub_rows2.get(x).sub_heading);
        TextView detail2 = (TextView)new_sub_row.findViewById(R.id.detail2);
        detail2.setText(sub_rows2.get(x).value);
        Log.i(LOG_TKT, sub_rows2.get(x).value);
        viewHolder.linearlayout_recyclerview_pd.addView(new_sub_row);
    }
    //viewHolder.imgThumbnail.setImageResource(movie.getThumbnail());
    hm2 = new HashMap<String, ArrayList<PD_Data>>();
    sub_rows2 = new ArrayList<PD_Data>();
}

私は何を間違っていますか?

4

2 に答える 2

2

RecyclerViews の使用方法に慣れていないことは、質問から明らかです。あなたは主題について読む必要があります。ここからが良いスタートです。

基本的に、Bind ViewHolder() は、 を通じて提供された項目レイアウトを保持する viewHolders にデータをバインドすることのみを担当しますonCreateViewHolder()。その理由は、RecyclerView がビューをリサイクルするため、スクロールするたびに新しいビューを作成する必要がないからです。

あなたの場合、 RecyclerView にさまざまなアイテムにさまざまな viewHolders を使用するように指示するテクニックを使用する必要があるようです。ここでその方法を確認してください

于 2015-10-12T20:45:27.210 に答える
1

別の質問でViewHolderを使用してデータをバインドするためのより良い方法について回答しました。ここで確認できますRecyclerView はリサイクル時に問題を引き起こします これがお役に立てば幸いです これはあなたの問題をうまく解決します。 編集

あなたの問題はもう解決しましたか?そうでない場合は、私のアドバイスを検討してください。あなたは問題を知っていますか?アイテム 0 の ViewHOlder を作成し、それにテキストを追加するとします。スクロール中に、この ViewHolder がアイテム番号 10 でリサイクルされたと仮定すると、コードによれば、アイテム番号 0 に追加したいくつかのテキスト行とともに新しいテキスト行が追加されます。次のように解決できます。

LayoutInflater inflater;
View new_sub_row;

//check here if the linear layout already has previusely added child, if  yes remove them   
if(viewHolder.linearlayout_recyclerview_pd.getChildCount()>0){
    viewHolder.linearlayout_recyclerview_pd.removeAllViews();
}
for(int x=0;x<sub_rows2.size();x++){
    inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
    new_sub_row = inflater.inflate(R.layout.recyclerview_pd, null);
    TextView heading2 = (TextView)new_sub_row.findViewById(R.id.heading2);
    heading2.setText(sub_rows2.get(x).sub_heading);
    Log.i(LOG_TKT,sub_rows2.get(x).sub_heading);
    TextView detail2 = (TextView)new_sub_row.findViewById(R.id.detail2);
    detail2.setText(sub_rows2.get(x).value);
    Log.i(LOG_TKT, sub_rows2.get(x).value);
    viewHolder.linearlayout_recyclerview_pd.addView(new_sub_row);
}
于 2016-02-13T18:04:18.873 に答える