Android 如何将自定义视图添加到recyclerView

Android 如何将自定义视图添加到recyclerView,android,android-recyclerview,Android,Android Recyclerview,我想做这样的事情(trello),我指的是总是出现在创建列表末尾的容器,用于创建新列表 我有一个回收器视图,适配器和数据库中的数据 适配器: class BoardAdapter(private val boards: ArrayList<String>) : RecyclerView.Adapter<BoardAdapter.ViewHolder>() { inner class ViewHolder(v: View) : RecyclerView.ViewH

我想做这样的事情(trello),我指的是总是出现在创建列表末尾的容器,用于创建新列表

我有一个回收器视图,适配器和数据库中的数据

适配器:

class BoardAdapter(private val boards: ArrayList<String>) : RecyclerView.Adapter<BoardAdapter.ViewHolder>() {

    inner class ViewHolder(v: View) : RecyclerView.ViewHolder(v) {
        val name = v.findViewById<TextView>(R.id.name)
        val view = v
    }

    override fun getItemCount(): Int {
        return boards.count()
    }

    override fun onBindViewHolder(holder: ViewHolder?, position: Int) {
        holder!!.name.text = boards[position]

        val v = holder.view

        v.setOnClickListener {
            val intent = Intent(v.context, BoardActivity::class.java)
            intent.putExtra("name", holder.name.text.toString())
            v.context.startActivity(intent)
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup?, viewType: Int): ViewHolder {
        val v = LayoutInflater.from(parent!!.context).inflate(R.layout.board_list_item,
                parent, false)
        return ViewHolder(v)
    }
}
class BoardAdapter(私有val板:ArrayList):RecyclerView.Adapter(){
内部类ViewHolder(v:视图):RecyclerView.ViewHolder(v){
val name=v.findviewbyd(R.id.name)
val视图=v
}
重写getItemCount():Int{
返回板。计数()
}
覆盖BindViewHolder(holder:ViewHolder?,位置:Int){
holder!!.name.text=板[位置]
val v=保持架视图
v、 setOnClickListener{
val intent=intent(v.context,BoardActivity::class.java)
intent.putExtra(“name”,holder.name.text.toString())
v、 上下文。起始触觉(意图)
}
}
覆盖创建ViewHolder(父级:ViewGroup?,viewType:Int):ViewHolder{
val v=LayoutFlater.from(parent!!.context)。充气(R.layout.board\u list\u项,
父对象(错误)
返回视窗支架(v)
}
}
主要活动

 class MainActivity : AppCompatActivity() {

        private lateinit var db: SQLiteDatabase
        private lateinit var cursor: Cursor

        private lateinit var adapter: BoardAdapter
        private val boards = ArrayList<String>()
        private val helper = DBHelper(this)

        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)

            try {
                db = helper.readableDatabase
                cursor = db.query("BOARD", arrayOf("name"),
                        null, null, null, null, null)

                while (cursor.moveToNext()) {
                    boards.add(cursor.getString(0))
                }

                cursor.close()
                db.close()
            } catch (e: SQLException) {
                Log.e("SQL ERROR", e.message.toString())
                Toast.makeText(this, R.string.db_error, Toast.LENGTH_SHORT).show()
            }

            adapter = BoardAdapter(boards)
            recyclerView.layoutManager = GridLayoutManager(applicationContext, 2)
            recyclerView.adapter = adapter

        }
}
class MainActivity:AppCompatActivity(){
私有lateinit var db:SQLiteDatabase
私有lateinit变量游标:游标
专用lateinit变量适配器:BoardAdapter
private val boards=ArrayList()
private val helper=DBHelper(此)
重写创建时的乐趣(savedInstanceState:Bundle?){
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
试一试{
db=helper.readableDatabase
cursor=db.query(“板”,数组(“名称”),
空,空,空,空,空,空)
while(cursor.moveToNext()){
boards.add(cursor.getString(0))
}
cursor.close()
db.close()
}catch(e:SQLException){
Log.e(“SQL错误”,例如message.toString())
Toast.makeText(this,R.string.db_错误,Toast.LENGTH_SHORT.show())
}
适配器=板适配器(板)
RecycleView.layoutManager=GridLayoutManager(applicationContext,2)
recyclerView.adapter=适配器
}
}

所以,我有这个:。我想在这个RecyclerView的末尾添加一个自定义视图,用于添加新板。如何从布局中创建此视图并将此视图添加到RecyclerView,我的结果如下:

您可以在RecyclerView的适配器上定义多个视图类型。这样,您就可以选择要在给定位置充气的元件

大概是这样的:

    public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
    class ViewHolder0 extends RecyclerView.ViewHolder {
        ...
        public ViewHolder0(View itemView){
        ...
        }
    }

    class ViewHolder2 extends RecyclerView.ViewHolder {
        ...
        public ViewHolder2(View itemView){
        ...
    }

    @Override
    public int getItemViewType(int position) {
        // Just as an example, return 0 or 2 depending on position
        // Note that unlike in ListView adapters, types don't have to be contiguous
        return position % 2 * 2;
    }

    @Override
    public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
         switch (viewType) {
             case 0: return new ViewHolder0(...);
             case 2: return new ViewHolder2(...);
             ...
         }
    }

    @Override
    public void onBindViewHolder(final RecyclerView.ViewHolder holder, final int position) {
        switch (holder.getItemViewType()) {
            case 0:
                ViewHolder0 viewHolder0 = (ViewHolder0)holder;
                ...
                break;

            case 2:
                ViewHolder2 viewHolder2 = (ViewHolder2)holder;
                ...
                break;
        }
    }
}
公共类MyAdapter扩展了RecyclerView.Adapter{ 类ViewHolder0扩展了RecyclerView.ViewHolder{ ... 公共视图持有者0(视图项视图){ ... } } 类ViewHolder2扩展了RecyclerView.ViewHolder{ ... 公共视图持有者2(视图项视图){ ... } @凌驾 public int getItemViewType(int位置){ //例如,根据位置返回0或2 //注意,与ListView适配器不同,类型不必是连续的 返回位置%2*2; } @凌驾 public RecyclerView.ViewHolder onCreateViewHolder(视图组父级,int-viewType){ 开关(视图类型){ 案例0:返回新的ViewHolder0(…); 案例2:返回新的ViewHolder2(…); ... } } @凌驾 公共无效onBindViewHolder(最终RecyclerView.ViewHolder,最终整型位置){ 开关(holder.getItemViewType()){ 案例0: ViewHolder0 ViewHolder0=(ViewHolder0)holder; ... 打破 案例2: ViewHolder2 ViewHolder2=(ViewHolder2)支架; ... 打破 } } }
参考问题的答案。

不清楚,请解释小细节创建自定义视图(布局)并扩大布局。你的问题更多的是一个自以为是的问题,不推荐。请做更多的研究,并对你的想法进行编码;如果你真的卡住了,欢迎你再次提问,但要使用代码。我需要将始终出现在RecyclerView末尾的视图作为RecyclerView的最后一个元素,看看示例pictUre但是我的数据集中没有这个元素,它在适配器中,如果这个元素没有位置,我怎么能返回第二个ViewHolder?如果我没弄错的话,这段代码只对数据集中的元素有效。当然,我可以在MainActivity中的数据集中添加mock元素,然后用那种方式处理它,但我认为这是一个错误的解决方案n、 如果视图必须始终在末尾膨胀,则覆盖函数getItemCount():Int{return boards.count()+1}检查getItemViewType()中的最后一个位置,然后返回视图,否则返回项目view@Hollow你试过了吗