如何在 recyclerview 中的特定位置添加分隔符?
How to add separator at particular position inside recyclerview?
我有一个任务列表列表。为了显示列表,我使用了 recyclerview。我的列表中有今天、明天和以后的前 3 个项目。我想在回收站视图中的第一个 3 项之后添加一个分隔符。我该怎么做?
适配器:
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ItemViewHolder>{
ArrayList<ListData> item;
public static final int TYPE1=1;
Context conext;
public ListAdapter(Context context, ArrayList<ListData> item) {
this.conext=context;
this.item=item;
}
public interface OnItemClickListener {
void onItemClick(ListData listData);
}
@Override
public int getItemCount() {
return item.size();
}
public void remove(int position) {
item.remove(position);
notifyItemRemoved(position);
}
// @Override
// public int getItemViewType(int position) {
// return item.get(position).getExpenseType();// Assume that this return 1 0r 2
// }
@Override
public void onBindViewHolder(ItemViewHolder itemViewHolder,final int i) {
itemViewHolder.listName.setText(item.get(i).getTitle());
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.list_layout, viewGroup, false);
return new ItemViewHolder(itemView,viewType);
}
public static class ItemViewHolder extends RecyclerView.ViewHolder {
TextView listName;
ItemViewHolder(View itemView, int viewType) {
super(itemView);
listName = (TextView)itemView.findViewById(R.id.listData);
}
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
}
任何人都可以帮助我如何在列表中的 3 个项目之后放置分隔符?
谢谢..
您可以创建两个 ViewHolder
class 并在 onCreateViewHolder
中切换它们。一个包含您的自定义行,其他作为您的自定义列表项。
class ViewHolderLine extends RecyclerView.ViewHolder { //contains line
}
class ViewHolderItems extends RecyclerView.ViewHolder { //contains data
}
@Override
public int getItemViewType(int position) {
return item.get(position).getExpenseType();// Assume that this return 1 0r 2
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
switch (viewType) {
case 1: return new ViewHolderLine();
case 2:
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.list_layout, viewGroup, false);
return new ItemViewHolder(itemView,viewType);
}
}
您可以查看详细说明here了解更多信息。
您应该定义 2 种类型的 RecyclerView 行:
...YourRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder>
public static final int COMMON = 1;
public static final int SEPARATOR = 2;
覆盖 Adapter
的 getItemViewType
方法:
@Override
public int getItemViewType(int position) {
if (position%10 == 0) //each 10 row is separator (change it!)
return SEPARATOR;
else return COMMON;
}
更改 onCreateViewHolder
方法 Adapter
:
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == COMMON)
return new ItemViewHolder(LayoutInflater.from(activity).inflate(R.layout.list_layout, parent, false));
else
return new SeparatorHolder(LayoutInflater.from(activity).inflate(R.layout.separator_item, parent, false));
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
if (getItemViewType(position) == COMMON) {
//do stuff
} else {
}
}
ItemViewHolder
扩展 BaseViewHolder
SeparatorHolder
扩展 BaseViewHolder
BaseViewHolder
扩展 RecyclerView.ViewHolder
如果你知道你只会在第一个三个项目中添加分隔符,那么你可以根据项目的 position
在 onBindViewHolder
.[=12 中放置一个条件=]
ps: 请不要忘记在 if 块后添加 else 块
一种解决方案是定义两种类型的 RecyclerView 行(一种用于普通行,一种用于分隔符)
另一个解决方案是你应该在 custom RecycleView row xml
的底部添加一个 Separator View
<View
android:id="@+id/separatorView"
android:layout_width="match_parent"
android:layout_height="3dp"
android:visible="gone"
android:background="@android:color/darker_gray"/>
然后在 RecyclerView.Adapter
的 bindViewHolder
中,隐藏普通行中的分隔符并在分隔符行中显示它
@Override
public void bindViewHolder(ViewHolder holder, int position) {
if(position == separatorPosition){
holder.separatorView.visible = View.VISIBLE;
}else{
holder.separatorView.visible = View.GONE;
}
}
希望对您有所帮助
我有一个包含 header 部分的 Recyclerview,每个部分中的项目数量不定。该部分应该在整个屏幕上有一个行分隔符。并且项目之间必须有一条填充线。
所以,我的解决方案(在 kotlin 中)有两个视图持有者,一个用于 header,一个用于项目。在 getItemViewType 中,return 基于项目的类型。
override fun getItemViewType(position: Int): Int {
if(dataList[position] is HeaderItem)
return Companion.TYPE_HEADER
return Companion.TYPE_ITEM
}
并在createviewholder中创建对应的viewholder,进行相应的绑定。
二手
parent.getChildViewHolder(parent.getChildAt(i))
决定项目分隔符的填充(或颜色或宽度)。
class ItemDivider(context: Context) : RecyclerView.ItemDecoration() {
private var mDivider: Drawable
private val mContext = context
companion object {
private val ATTRS = intArrayOf(android.R.attr.listDivider)
}
init {
val styledAttributes = context.obtainStyledAttributes(ATTRS)
mDivider = styledAttributes.getDrawable(0)
mDivider.setTint(ContextCompat.getColor(mContext, <color>))
styledAttributes.recycle()
}
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State?) {
val right = parent.width - parent.paddingRight
for (i in 0 until parent.childCount - 1) {
val child = parent.getChildAt(i)
val params = child.layoutParams as RecyclerView.LayoutParams
val left = if (parent.getChildViewHolder(child) is HeaderViewHolder) {
0
} else {
child.left + params.leftMargin + mContext.resources.getDimension(<padding_in_dp>).toInt()
}
val top = child.bottom + params.bottomMargin
val bottom = top + mDivider.intrinsicHeight + <divider_height>
mDivider.setBounds(left, top, right, bottom)
mDivider.draw(c)
}
}
}
记得用有效值替换颜色、填充、分隔线高度。
希望对您有所帮助!
我有一个任务列表列表。为了显示列表,我使用了 recyclerview。我的列表中有今天、明天和以后的前 3 个项目。我想在回收站视图中的第一个 3 项之后添加一个分隔符。我该怎么做?
适配器:
public class ListAdapter extends RecyclerView.Adapter<ListAdapter.ItemViewHolder>{
ArrayList<ListData> item;
public static final int TYPE1=1;
Context conext;
public ListAdapter(Context context, ArrayList<ListData> item) {
this.conext=context;
this.item=item;
}
public interface OnItemClickListener {
void onItemClick(ListData listData);
}
@Override
public int getItemCount() {
return item.size();
}
public void remove(int position) {
item.remove(position);
notifyItemRemoved(position);
}
// @Override
// public int getItemViewType(int position) {
// return item.get(position).getExpenseType();// Assume that this return 1 0r 2
// }
@Override
public void onBindViewHolder(ItemViewHolder itemViewHolder,final int i) {
itemViewHolder.listName.setText(item.get(i).getTitle());
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.list_layout, viewGroup, false);
return new ItemViewHolder(itemView,viewType);
}
public static class ItemViewHolder extends RecyclerView.ViewHolder {
TextView listName;
ItemViewHolder(View itemView, int viewType) {
super(itemView);
listName = (TextView)itemView.findViewById(R.id.listData);
}
}
@Override
public void onAttachedToRecyclerView(RecyclerView recyclerView) {
super.onAttachedToRecyclerView(recyclerView);
}
}
任何人都可以帮助我如何在列表中的 3 个项目之后放置分隔符? 谢谢..
您可以创建两个 ViewHolder
class 并在 onCreateViewHolder
中切换它们。一个包含您的自定义行,其他作为您的自定义列表项。
class ViewHolderLine extends RecyclerView.ViewHolder { //contains line
}
class ViewHolderItems extends RecyclerView.ViewHolder { //contains data
}
@Override
public int getItemViewType(int position) {
return item.get(position).getExpenseType();// Assume that this return 1 0r 2
}
@Override
public ItemViewHolder onCreateViewHolder(ViewGroup viewGroup,int viewType) {
switch (viewType) {
case 1: return new ViewHolderLine();
case 2:
View itemView = LayoutInflater.
from(viewGroup.getContext()).
inflate(R.layout.list_layout, viewGroup, false);
return new ItemViewHolder(itemView,viewType);
}
}
您可以查看详细说明here了解更多信息。
您应该定义 2 种类型的 RecyclerView 行:
...YourRecyclerAdapter extends RecyclerView.Adapter<BaseViewHolder>
public static final int COMMON = 1;
public static final int SEPARATOR = 2;
覆盖 Adapter
的 getItemViewType
方法:
@Override
public int getItemViewType(int position) {
if (position%10 == 0) //each 10 row is separator (change it!)
return SEPARATOR;
else return COMMON;
}
更改 onCreateViewHolder
方法 Adapter
:
@Override
public BaseViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if (viewType == COMMON)
return new ItemViewHolder(LayoutInflater.from(activity).inflate(R.layout.list_layout, parent, false));
else
return new SeparatorHolder(LayoutInflater.from(activity).inflate(R.layout.separator_item, parent, false));
}
@Override
public void onBindViewHolder(BaseViewHolder holder, int position) {
if (getItemViewType(position) == COMMON) {
//do stuff
} else {
}
}
ItemViewHolder
扩展 BaseViewHolder
SeparatorHolder
扩展 BaseViewHolder
BaseViewHolder
扩展 RecyclerView.ViewHolder
如果你知道你只会在第一个三个项目中添加分隔符,那么你可以根据项目的 position
在 onBindViewHolder
.[=12 中放置一个条件=]
ps: 请不要忘记在 if 块后添加 else 块
一种解决方案是定义两种类型的 RecyclerView 行(一种用于普通行,一种用于分隔符)
另一个解决方案是你应该在 custom RecycleView row xml
Separator View
<View
android:id="@+id/separatorView"
android:layout_width="match_parent"
android:layout_height="3dp"
android:visible="gone"
android:background="@android:color/darker_gray"/>
然后在 RecyclerView.Adapter
的 bindViewHolder
中,隐藏普通行中的分隔符并在分隔符行中显示它
@Override
public void bindViewHolder(ViewHolder holder, int position) {
if(position == separatorPosition){
holder.separatorView.visible = View.VISIBLE;
}else{
holder.separatorView.visible = View.GONE;
}
}
希望对您有所帮助
我有一个包含 header 部分的 Recyclerview,每个部分中的项目数量不定。该部分应该在整个屏幕上有一个行分隔符。并且项目之间必须有一条填充线。
override fun getItemViewType(position: Int): Int {
if(dataList[position] is HeaderItem)
return Companion.TYPE_HEADER
return Companion.TYPE_ITEM
}
并在createviewholder中创建对应的viewholder,进行相应的绑定。
二手
parent.getChildViewHolder(parent.getChildAt(i))
决定项目分隔符的填充(或颜色或宽度)。
class ItemDivider(context: Context) : RecyclerView.ItemDecoration() {
private var mDivider: Drawable
private val mContext = context
companion object {
private val ATTRS = intArrayOf(android.R.attr.listDivider)
}
init {
val styledAttributes = context.obtainStyledAttributes(ATTRS)
mDivider = styledAttributes.getDrawable(0)
mDivider.setTint(ContextCompat.getColor(mContext, <color>))
styledAttributes.recycle()
}
override fun onDraw(c: Canvas, parent: RecyclerView, state: RecyclerView.State?) {
val right = parent.width - parent.paddingRight
for (i in 0 until parent.childCount - 1) {
val child = parent.getChildAt(i)
val params = child.layoutParams as RecyclerView.LayoutParams
val left = if (parent.getChildViewHolder(child) is HeaderViewHolder) {
0
} else {
child.left + params.leftMargin + mContext.resources.getDimension(<padding_in_dp>).toInt()
}
val top = child.bottom + params.bottomMargin
val bottom = top + mDivider.intrinsicHeight + <divider_height>
mDivider.setBounds(left, top, right, bottom)
mDivider.draw(c)
}
}
}
记得用有效值替换颜色、填充、分隔线高度。
希望对您有所帮助!