65

この質問は以前にもあったかもしれませんが、正確な答えや解決策を見つけることができなかったようです。RecyclerView の使用を開始し、LinearLayoutManager を使用して実装しました。ここで、RecyclerView の他の項目とは異なるカスタム ヘッダーおよびフッター項目を追加したいと考えています。ヘッダーとフッターは固定してはいけません。残りのアイテムと一緒にスクロールしたいです。誰かがこれを行う方法の例を指摘したり、アイデアを共有したりできますか. とても感謝しています。どうも

4

12 に答える 12

8

recyclerview:1.2.0 がConcatAdapter を導入

ConcatAdapter は、複数のアダプターを直線的に組み合わせることができる新しい RecyclerView アダプターです。

ConcatAdapter の使用方法

build.gradle次の依存関係をファイルに追加します

androidx.recyclerview:recyclerview:1.2.0-alpha04

次に、複数のアダプターがある場合は、次を使用して簡単にマージできます

  MyAdapter adapter1 = ...;
 AnotherAdapter adapter2 = ...;
 ConcatAdapter merged = new ConcatAdapter(adapter1, adapter2);
 recyclerView.setAdapter(merged);

上記の例では、ConcatAdapter は、adapter1 の項目と、それに続く adapter2 の項目を表示します。

ここでは、完全なドキュメントを見つけることができます。

ここで完全な作業サンプルを見つけてください。

詳細については、この記事をお読みください。

ここでソースコードを見つけることができます。

于 2020-04-03T09:10:44.030 に答える
3

ここで、recyclerview のヘッダー項目の装飾

フッターに変更できるいくつかの変更

public class HeaderItemDecoration extends RecyclerView.ItemDecoration {

private View customView;

public HeaderItemDecoration(View view) {
    this.customView = view;
}

@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
    super.onDraw(c, parent, state);
    customView.layout(parent.getLeft(), 0, parent.getRight(), customView.getMeasuredHeight());
    for (int i = 0; i < parent.getChildCount(); i++) {
        View view = parent.getChildAt(i);
        if (parent.getChildAdapterPosition(view) == 0) {
            c.save();
            final int height = customView.getMeasuredHeight();
            final int top = view.getTop() - height;
            c.translate(0, top);
            customView.draw(c);
            c.restore();
            break;
        }
    }
}

@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
    if (parent.getChildAdapterPosition(view) == 0) {
        customView.measure(View.MeasureSpec.makeMeasureSpec(parent.getMeasuredWidth(), View.MeasureSpec.AT_MOST),
                View.MeasureSpec.makeMeasureSpec(parent.getMeasuredHeight(), View.MeasureSpec.AT_MOST));
        outRect.set(0, customView.getMeasuredHeight(), 0, 0);
    } else {
        outRect.setEmpty();
    }
}
}      
于 2016-10-12T17:54:11.863 に答える
2

ここをクリックしてください。RecyclerView.Adapter の拡張を行いました。ヘッダーとフッターを簡単に追加できます。

class HFAdapter extends HFRecyclerViewAdapter<String, HFAdapter.DataViewHolder>{

    public HFAdapter(Context context) {
        super(context);
    }

    @Override
    public DataViewHolder onCreateDataItemViewHolder(ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.data_item, parent, false);
        return new DataViewHolder(v);
    }

    @Override
    public void onBindDataItemViewHolder(DataViewHolder holder, int position) {
        holder.itemTv.setText(getData().get(position));
    }

    class DataViewHolder extends RecyclerView.ViewHolder{
        TextView itemTv;
        public DataViewHolder(View itemView) {
            super(itemView);
            itemTv = (TextView)itemView.findViewById(R.id.itemTv);
        }
    }
}

//add header
View headerView = LayoutInflater.from(this).inflate(R.layout.header, recyclerView, false);
hfAdapter.setHeaderView(headerView);
//add footer
View footerView = LayoutInflater.from(this).inflate(R.layout.footer, recyclerView, false);
hfAdapter.setFooterView(footerView);

//remove
hfAdapter.removeHeader();
hfAdapter.removeFooter();
于 2015-09-07T01:31:49.260 に答える
1

ライブラリSectionedRecyclerViewAdapterを使用できます。これには「セクション」の概念があり、セクションにはヘッダー、フッター、およびコンテンツ (アイテムのリスト) があります。あなたの場合、必要なセクションは 1 つだけかもしれませんが、多数持つことができます。

ここに画像の説明を入力

1) カスタム セクション クラスを作成します。

class MySection extends StatelessSection {

    List<String> myList = Arrays.asList(new String[] {"Item1", "Item2", "Item3" });

    public MySection() {
        // call constructor with layout resources for this Section header, footer and items 
        super(R.layout.section_header, R.layout.section_footer,  R.layout.section_item);
    }

    @Override
    public int getContentItemsTotal() {
        return myList.size(); // number of items of this section
    }

    @Override
    public RecyclerView.ViewHolder getItemViewHolder(View view) {
        // return a custom instance of ViewHolder for the items of this section
        return new MyItemViewHolder(view);
    }

    @Override
    public void onBindItemViewHolder(RecyclerView.ViewHolder holder, int position) {
        MyItemViewHolder itemHolder = (MyItemViewHolder) holder;

        // bind your view here
        itemHolder.tvItem.setText(myList.get(position));
    }
}

2) 項目のカスタム ViewHolder を作成します。

class MyItemViewHolder extends RecyclerView.ViewHolder {

    private final TextView tvItem;

    public MyItemViewHolder(View itemView) {
        super(itemView);

        tvItem = (TextView) itemView.findViewById(R.id.tvItem);
    }
}

3)SectionedRecyclerViewAdapterを使用してReclyclerViewを設定します

// Create an instance of SectionedRecyclerViewAdapter 
SectionedRecyclerViewAdapter sectionAdapter = new SectionedRecyclerViewAdapter();

MySection mySection = new MySection();

// Add your Sections
sectionAdapter.addSection(mySection);

// Set up your RecyclerView with the SectionedRecyclerViewAdapter
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
recyclerView.setAdapter(sectionAdapter);
于 2016-03-05T21:57:46.440 に答える
1

GroupAdapterが必要な場合があります。

RecyclerView.Adapter のシーケンスからデータを表示する特殊な RecyclerView.Adapter。順序は静的ですが、各アダプタは 0 個以上のアイテム ビューで表示できます。子アダプタは ViewType を安全に使用できます。さらに、ListView のように、HeaderView や addFooterView を追加できます。

于 2016-05-04T01:24:44.603 に答える