この質問は以前にもあったかもしれませんが、正確な答えや解決策を見つけることができなかったようです。RecyclerView の使用を開始し、LinearLayoutManager を使用して実装しました。ここで、RecyclerView の他の項目とは異なるカスタム ヘッダーおよびフッター項目を追加したいと考えています。ヘッダーとフッターは固定してはいけません。残りのアイテムと一緒にスクロールしたいです。誰かがこれを行う方法の例を指摘したり、アイデアを共有したりできますか. とても感謝しています。どうも
12 に答える
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 の項目を表示します。
ここでは、完全なドキュメントを見つけることができます。
ここで完全な作業サンプルを見つけてください。
詳細については、この記事をお読みください。
ここでソースコードを見つけることができます。
ここで、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();
}
}
}
ここをクリックしてください。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();
ライブラリ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);
GroupAdapterが必要な場合があります。
RecyclerView.Adapter のシーケンスからデータを表示する特殊な RecyclerView.Adapter。順序は静的ですが、各アダプタは 0 個以上のアイテム ビューで表示できます。子アダプタは ViewType を安全に使用できます。さらに、ListView のように、HeaderView や addFooterView を追加できます。