Android 如何将自定义视图添加到recyclerView
我想做这样的事情(trello),我指的是总是出现在创建列表末尾的容器,用于创建新列表 我有一个回收器视图,适配器和数据库中的数据 适配器: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
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你试过了吗