Java 在recyclerview中添加节

Java 在recyclerview中添加节,java,android,android-recyclerview,header,Java,Android,Android Recyclerview,Header,我制作了recyclerview,现在我想在recyclerview中添加标题(我的意思是1个标题位于recyclerview顶部,其他标题可能位于recyclerview中间) 这是我的主要活动,希望arraylist中给出的提示能进一步澄清我的问题: public类MainActivity扩展了AppCompatActivity{ @凌驾 创建时受保护的void(Bundle savedInstanceState){ super.onCreate(savedInstanceState); s

我制作了recyclerview,现在我想在recyclerview中添加标题(我的意思是1个标题位于recyclerview顶部,其他标题可能位于recyclerview中间)

这是我的主要活动,希望arraylist中给出的提示能进一步澄清我的问题:

public类MainActivity扩展了AppCompatActivity{
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
回收视图…
…(裁员经理);
ArrayList rvList=新的ArrayList();
//我想在这里添加“标题1”
添加(新Rv(R.mipmap.ic_launcher_round,“小罗伯特·多恩里”,“铁人”);
添加(新Rv(R.mipmap.ic_launcher_round,“汤姆·霍兰德”,“蜘蛛侠”);
添加(新Rv(R.mipmap.ic_launcher_round,“克里斯·埃文斯”,“美国队长”);
//我想在这里添加标题2
添加(新Rv(R.mipmap.ic_launcher_round,“Mark Ruffalo”,“Hulk”));
添加(新Rv(R.mipmap.ic_launcher_round,“Chris Hemsworth”,“Thor”);
//我想在这里添加标题3
添加(新Rv(R.mipmap.ic_launcher_round,“Tom Hiddleston”,“Loki”);
添加(新Rv(R.mipmap.ic_launcher_round,“Zoe Saldana”,“Gamora”);
RvAdapter适配器=新的RvAdapter(rvList);
recyclerView.setAdapter(适配器);
}
}
这是我用于此recyclerView的适配器:

public class RvAdapter extends RecyclerView.Adapter<RvAdapter.RvHolderView> {

    public ArrayList<Rv> rvList;

    public RvAdapter(ArrayList<Rv> rvList) {
        this.rvList = rvList;
    }

    @NonNull
    @Override
    public RvHolderView onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
      View view =  LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.rv_view, viewGroup, false);
        return new RvHolderView(view);
    }

    @Override
    public void onBindViewHolder(@NonNull RvHolderView rvHolderView, int i) {
        Rv current = rvList.get(i);
        rvHolderView.imageView.setImageResource(current.getImage());
        rvHolderView.text1.setText(current.getText1());
        rvHolderView.text2.setText(current.getText2());
    }

    @Override
    public int getItemCount() {
        return rvList.size();
    }

    public static class RvHolderView extends RecyclerView.ViewHolder {
        public ImageView imageView;
        public TextView text1;
        public TextView text2;
        public RvHolderView(@NonNull View itemView) {
            super(itemView);
             imageView = itemView.findViewById(R.id.img);
             text1 = itemView.findViewById(R.id.texta);
            text2 = itemView.findViewById(R.id.textb);
         }
    }
}
公共类RvAdapter扩展了RecyclerView.Adapter{ 公共阵列列表; 公共RvAdapter(ArrayList rvList){ this.rvList=rvList; } @非空 @凌驾 public RvHolderView onCreateViewHolder(@NonNull ViewGroup ViewGroup,int i){ View View=LayoutFlater.from(viewGroup.getContext()).inflate(R.layout.rv_视图,viewGroup,false); 返回新的RvHolderView(视图); } @凌驾 BindViewHolder上的公共无效(@NonNull RvHolderView RvHolderView,int i){ Rv电流=rvList.get(i); rvHolderView.imageView.setImageResource(current.getImage()); rvHolderView.text1.setText(current.getText1()); rvHolderView.text2.setText(current.getText2()); } @凌驾 public int getItemCount(){ 返回rvList.size(); } 公共静态类RvHolderView扩展了RecyclerView.ViewHolder{ 公共影像视图; 公共文本视图文本1; 公共文本视图文本2; public RvHolderView(@NonNull View itemView){ 超级(项目视图); imageView=itemView.findViewById(R.id.img); text1=itemView.findviewbyd(R.id.texta); text2=itemView.findviewbyd(R.id.textb); } } }
您可以按不同类型制作。您可以在
Rv
示例中添加
type
字段:

rvList.add(new Rv(R.mipmap.ic_launcher_round, "Robert Doenry Jr.", "IronMan", "header"));
rvList.add(new Rv(R.mipmap.ic_launcher_round, "Robert Doenry Jr.", "IronMan","item"));
rvList.add(new Rv(R.mipmap.ic_launcher_round, "Tom Holland", "Spider Man","item"));
在回收器视图中,您可以覆盖
getItemViewType

例如:

 override fun getItemViewType(position: Int): Int {
        return if(itemList(position).type.equals("header")) 0 else 1
    }
并在
onCreateViewHolder
onBindViewHolder
中按不同类型创建不同的ViewHolder

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
        return when (type) {
               type1 -> //do your staff
               type2 -> //do your staff
               else -> //do your Staff
    }
}

您需要的是多类型回收器视图:

假设列表的标题只是一个ImageView,列表的其他项目只是一个文本,如下所示:

  • 标题(图像视图)
  • 项目(文本视图)
  • 项目(文本视图)
  • 项目(文本视图)
以下是您应该遵循的步骤:

  • 定义将viewType添加到项目的界面

    interface RecyclerData {
        val viewType: Int
    }
    
  • 为每个视图类型定义一个数据类:

    enum class ItemsViewType{
        HEADER,
        ITEM
    }
    
    data class PrimaryItem(val headerImageUri:String) : RecyclerData {
         override val viewType = ItemsViewType.HEADER.ordinal
    }
    
    data class SecondaryItem(val itemContent:String) : RecyclerData {
         override val viewType = ItemsViewType.ITEM.ordinal
    }
    
  • 创建您的RecyclerView适配器:

    class MyBeautifulAdapter<T : RecyclerData> : RecyclerView.Adapter<RecyclerViewHolder<T>>(){
    
    var items: ArrayList<T> = arrayListOf()
    set(value) {
        field = value
        notifyDataSetChanged()
    }
    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerViewHolder<T> {
        return when(viewType){
            ItemsViewType.HEADER.ordinal -> HeaderViewHolder(LayoutInfaltor.from(parent.context).inflate(R.layout.row_header,parent,false)),
            ItemsViewType.ITEM.ordinal -> ItemViewHolder(LayoutInflator.from(parent.context).inflate(R.layout.row_secondary,parent,false))
        }
    }  
    override fun getItemViewType(position: Int): Int {
        return items[position].viewType
    }
    
    override fun onBindViewHolder(holder: RecyclerViewHolder<T>, position: Int) {
        holder.bind(items[position])
    }
    
    类MyBeautifulAdapter:RecyclerView.Adapter(){
    变量项:ArrayList=arrayListOf()
    设置(值){
    字段=值
    notifyDataSetChanged()
    }
    override fun onCreateViewHolder(父级:ViewGroup,viewType:Int):RecycleServiceWholder{
    返回时间(viewType){
    ItemsViewType.HEADER.ordinal->HeaderViewHolder(LayoutInfaltor.from(parent.context).充气(R.layout.row_HEADER,parent,false)),
    ItemsViewType.ITEM.ordinal->ItemViewHolder(LayoutInflator.from(parent.context)。充气(R.layout.row_secondary,parent,false))
    }
    }  
    覆盖getItemViewType(位置:Int):Int{
    返回项目[位置].viewType
    }
    覆盖BindViewHolder(holder:RecycleServiceWholder,位置:Int){
    持有者绑定(项目[位置])
    }
    
  • 观众:

    open class RecyclerViewHolder<T : RecyclerData>(val itemView: View) : RecyclerView.ViewHolder(itemView){
         open fun bindData(item:T){
         }
    }
    class HeaderViewHolder(private val view:View) : RecyclerViewHolder<PrimaryItem>(view){
        override fun bindData(item: PrimaryItem) {
            // load header image he
        }
    }
    class ItemViewHolder(private val view:View) : RecyclerViewHolder<SecondaryItem>(view){
        override fun bindData(item: SecondaryItem) {
            // set textView content here
        }
    }
    
    打开类RecyclerViewWholder(val itemView:View):RecyclerView.ViewHolder(itemView){
    打开数据(项目:T){
    }
    }
    类HeaderServiceWholder(私有值视图:视图):RecycleServiceWholder(视图){
    覆盖数据(项:PrimaryItem){
    //加载标题图像
    }
    }
    类ItemViewHolder(私有val视图:视图):RecycleServiceWholder(视图){
    覆盖数据(项目:SecondaryItem){
    //在此处设置文本视图内容
    }
    }
    

  • 也许这会帮助你:我没有得到任何这些。请@M.Sianaki一步一步地建议我实施什么以及在哪里实施?我没有得到这些请@Mindgamer一步一步地建议我。