界面设计(包括recyclerview listview)

提示:

提示:圆形头像用 CircleImageView
需要在 app 下的 build.gradle 导入,即在 dependencies 添加
implementation 'de.hdodenhof:circleimageview:2.1.0'
后点右上角 sync now 完成第三库的下载和导入
布局中应用示例:
< de.hdodenhof.circleimageview.CircleImageView
•        android:src ="@mipmap/ mh "
•        android:layout_width ="70dp"
•        android:layout_height ="70dp"
•        android:layout_gravity ="center"
•        android:layout_marginTop ="20dp"/>

MainActivity:

package com.example.yzltest3

import android.content.Intent
import android.os.Bundle
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AlertDialog
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class MainActivity : AppCompatActivity(){
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        val login:Button=findViewById(R.id.login)
        val cancel:Button=findViewById(R.id.cancel)
        val edittext1:EditText=findViewById(R.id.edittext1)
        val edittext2:EditText=findViewById(R.id.edittext2)
        cancel.setOnClickListener {
            finish()
        }
        login.setOnClickListener{
            val username="yezenglai"
            val password="123456"
            val inputu=edittext2.text.toString()
            val inputp=edittext1.text.toString()
            if (username.equals(inputu)and password.equals(inputp)){
                Toast.makeText(this,"登录成功",Toast.LENGTH_SHORT).show()
                val intent=Intent(this,ThirdActivity::class.java)
                startActivity(intent)
            }else{
                AlertDialog.Builder(this).apply {
                    setTitle("用户名或密码错误!")
                    setCancelable(false)
                    setPositiveButton("OK"){dialog,which->}
                    show()
                }
            }
        }
    }

}

activity_main布局:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".MainActivity"
    android:orientation="vertical">

    <de.hdodenhof.circleimageview.CircleImageView
        android:layout_width="100dp"
        android:layout_height="100dp"
        android:layout_centerInParent="true"
        android:layout_above="@id/edittext2"
        android:src="@drawable/mh"
        app:civ_border_width="2dp" />

    <EditText
        android:id="@+id/edittext2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:layout_above="@id/main1"
        android:maxLines="1"
        android:hint="请输入账号">
    </EditText>

    <LinearLayout
        android:id="@+id/main1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal"
        android:layout_centerInParent="true">

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="密码:"
            android:textSize="20dp">
        </TextView>

        <EditText
            android:id="@+id/edittext1"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:maxLines="1"
            android:hint="请输入密码">
        </EditText>
    </LinearLayout>

    <LinearLayout
        android:id="@+id/main2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_below="@id/main1"
        android:gravity="center"
        android:orientation="horizontal"
        >

        <Button
            android:id="@+id/login"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="登录"
            android:textSize="20dp"
            android:layout_margin="10dp">
        </Button>

        <Button
            android:id="@+id/cancel"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:text="退出"
            android:textSize="20dp">
        </Button>
    </LinearLayout>

</RelativeLayout>

SecondActivity:

package com.example.yzltest3

import android.os.Bundle
import android.widget.ArrayAdapter
import android.widget.ListView
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat

class SecondActivity : AppCompatActivity() {
    private val fruitlist=ArrayList<fruit>()
    private val data= listOf("apple","banana","orange","watermelon","pear","grape","pineapple","strawberry","cherry","mange")
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_second)
//        val adapter=ArrayAdapter<String>(this,android.R.layout.simple_list_item_1,data)
        val listview:ListView=findViewById(R.id.listview)
        initfruit()
        val adapter=fruitadapter(this,R.layout.fruit_item,fruitlist)
        listview.adapter=adapter
        listview.setOnItemClickListener{
            parent,view,position,id->
            val fruit=fruitlist[position]
            Toast.makeText(this,fruit.name,Toast.LENGTH_SHORT).show()
        }
    }

    private fun initfruit(){
        repeat(2){
            fruitlist.add(fruit("apple",R.drawable.apple_pic,"1"))
            fruitlist.add(fruit("banana",R.drawable.banana_pic,"1"))
            fruitlist.add(fruit("orange",R.drawable.orange_pic,"1"))
            fruitlist.add(fruit("watermalon",R.drawable.watermelon_pic,"1"))
            fruitlist.add(fruit("pear",R.drawable.pear_pic,"1"))
            fruitlist.add(fruit("pineapple",R.drawable.pineapple_pic,"1"))
            fruitlist.add(fruit("strawberry",R.drawable.strawberry_pic,"1"))
            fruitlist.add(fruit("cherry",R.drawable.cherry_pic,"1"))
            fruitlist.add(fruit("mango",R.drawable.mango_pic,"1"))
        }
    }
}

activity_second布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".SecondActivity">

    <ListView
        android:id="@+id/listview"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>
</androidx.constraintlayout.widget.ConstraintLayout>

ThirdActivity:

package com.example.yzltest3

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.util.Log
import android.widget.LinearLayout
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.activity.result.contract.ActivityResultContracts
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class ThirdActivity : AppCompatActivity() {
    private val fruitlist=ArrayList<fruit>()
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_third)
        val recyclerView:RecyclerView=findViewById(R.id.recyclerview)
        initfruits()
        val layoutManager=LinearLayoutManager(this)
        recyclerView.layoutManager=layoutManager
        val adapter = fruitadapter1(fruitlist) { clickedFruit ->
            if (clickedFruit.name.equals("茁猫")){
                val intent= Intent(this,forthActivity::class.java)
                startActivity(intent)
            }
        }
        recyclerView.adapter = adapter
    }

    private fun initfruits(){
        fruitlist.add(fruit("茁猫",R.drawable.mao,"金来嘎嘎好"))
        fruitlist.add(fruit("呆猫",R.drawable.mute,"金来嘎嘎好"))
        fruitlist.add(fruit("蠢猫",R.drawable.photo,"金来嘎嘎好"))
        fruitlist.add(fruit("猪猫",R.drawable.setting,"金来嘎嘎好"))
        fruitlist.add(fruit("艾斯比猫",R.drawable.video,"金来嘎嘎好"))
        fruitlist.add(fruit("懒猫",R.drawable.work,"金来嘎嘎好"))
    }

    val activityResultLauncher = registerForActivityResult(ActivityResultContracts.StartActivityForResult()) {
            result ->
        if (result.resultCode == Activity.RESULT_OK) {
            val data = result.data
            data?.let {
                val returnedData = it.getParcelableArrayListExtra<msg>("data_return")
                returnedData?.let {
                    val fruit=fruitlist.get(0)
                    fruit.fruittext=returnedData.get(returnedData.size-1).content
                }
            }
        }
    }

}

activity_third布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".ThirdActivity"
    android:orientation="horizontal">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.recyclerview.widget.RecyclerView>
</LinearLayout>

forthActivity:

package com.example.yzltest3

import android.app.Activity
import android.content.Intent
import android.os.Bundle
import android.view.Menu
import android.view.MenuItem
import android.view.View
import android.widget.Button
import android.widget.EditText
import android.widget.Toast
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import androidx.recyclerview.widget.LinearLayoutManager
import androidx.recyclerview.widget.RecyclerView

class forthActivity : AppCompatActivity() {
    private val msglist=ArrayList<msg>()
    private var adapter:msgadapter?=null

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_forth)
        val recyclerview:RecyclerView=findViewById(R.id.recyclerview)
        val send:Button=findViewById(R.id.send)
        initmsg()
        val layoutManager=LinearLayoutManager(this)
        recyclerview.layoutManager=layoutManager
        adapter= msgadapter(msglist)
        recyclerview.adapter=adapter
        send.setOnClickListener{
            val inputtext:EditText=findViewById(R.id.inputtext)
            val content=inputtext.text.toString()
            if (content.isNotEmpty()){
                val msg=msg(content,msg.TYPE_SENT)
                msglist.add(msg)
                adapter?.notifyItemInserted(msglist.size-1)
                val recyclerview:RecyclerView=findViewById(R.id.recyclerview)
                recyclerview.scrollToPosition(msglist.size-1)
                inputtext.setText("")
            }
        }
    }

    private fun initmsg(){
        val msg1=msg("金来嘎嘎好",msg.TYPE_RECEIVED)
        msglist.add(msg1)
        val msg2=msg("你好哇,你是哪位鸭",msg.TYPE_SENT)
        msglist.add(msg2)
        val msg3=msg("我是最爱你的茁林猫猫鸭",msg.TYPE_RECEIVED)
        msglist.add(msg3)
    }

    override fun onCreateOptionsMenu(menu: Menu?): Boolean {
        menuInflater.inflate(R.menu.main,menu)
        return true

    }

    override fun onOptionsItemSelected(item: MenuItem): Boolean {
        when(item.itemId){
            R.id.back_item->{
                val returnitem=Intent()
                returnitem.putExtra("data_return",msglist)
                setResult(Activity.RESULT_OK, returnitem)
                finish()
            }
        }
        return  true
    }

}

activity_forth布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/main"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".forthActivity"
    android:orientation="vertical">

    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="0dp"
        android:layout_weight="1"/>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

        <EditText
            android:id="@+id/inputtext"
            android:layout_width="0dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:hint="请输入"
            android:maxLines="2"/>

        <Button
            android:id="@+id/send"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="发送"/>

    </LinearLayout>
</LinearLayout>

fruit_item布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="60dp">

    <ImageView
        android:id="@+id/fruitImage"
        android:layout_width="40dp"
        android:layout_height="40dp"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>

    <LinearLayout
        android:id="@+id/right"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp">
        <TextView
            android:id="@+id/fruitname"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content">
        </TextView>

        <TextView
            android:id="@+id/fruittext"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textColor="@android:color/darker_gray">
        </TextView>

    </LinearLayout>

</LinearLayout>

msg_left_item布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="left">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_margin="10dp"
            android:layout_toRightOf="@+id/head"
            android:background="@drawable/message_left">

            <TextView
                android:id="@+id/leftmsg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_margin="10dp"
                android:textColor="#fff"/>
        </LinearLayout>

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/head"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentLeft="true"
            android:src="@drawable/mao"
            app:civ_border_width="2dp"/>
    </RelativeLayout>

</FrameLayout>

msg_right_item布局:

<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:padding="10dp">

    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="right">
        <LinearLayout
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginRight="10dp"
            android:layout_toLeftOf="@+id/head"
            android:background="@drawable/message_right">

            <TextView
                android:id="@+id/rightmsg"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_gravity="center"
                android:layout_margin="10dp"
                android:textColor="#000"/>

        </LinearLayout>

        <de.hdodenhof.circleimageview.CircleImageView
            android:id="@+id/head"
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:layout_alignParentRight="true"
            android:src="@drawable/mh"
            app:civ_border_width="2dp"/>
    </RelativeLayout>



</FrameLayout>

msgadapter:

package com.example.yzltest3

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.TextView
import androidx.recyclerview.widget.RecyclerView

class msgadapter(val msglist:List<msg>):RecyclerView.Adapter<RecyclerView.ViewHolder>() {
    inner class leftviewholder(view:View):RecyclerView.ViewHolder(view){
        val leftmsg:TextView=view.findViewById(R.id.leftmsg)
    }

    inner class rightviewholer(view:View):RecyclerView.ViewHolder(view){
        val rightmsg:TextView=view.findViewById(R.id.rightmsg)
    }

    override fun getItemViewType(position: Int): Int {
        val msg=msglist[position]
        return msg.type
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int)=if (viewType==msg.TYPE_RECEIVED){
        val view=LayoutInflater.from(parent.context).inflate(R.layout.msg_left_item,parent,false)
        leftviewholder(view)
    }else{
        val view=LayoutInflater.from(parent.context).inflate(R.layout.msg_right_item,parent,false)
        rightviewholer(view)
    }

    override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
        val msg=msglist[position]
        when(holder){
            is leftviewholder->holder.leftmsg.text=msg.content
            is rightviewholer->holder.rightmsg.text=msg.content
            else->throw IllegalAccessException()
            }
    }

    override fun getItemCount()=msglist.size
}

msg:

package com.example.yzltest3

import android.os.Parcel
import android.os.Parcelable

class msg(val content:String,val type:Int):Parcelable {
    constructor(parcel: Parcel) : this(
        parcel.readString()!!,
        parcel.readInt()
    )

    override fun writeToParcel(parcel: Parcel, flags: Int) {
        parcel.writeString(content)
        parcel.writeInt(type)
    }

    override fun describeContents(): Int {
        return 0
    }

    companion object CREATOR : Parcelable.Creator<msg> {
        override fun createFromParcel(parcel: Parcel): msg {
            return msg(parcel)
        }

        override fun newArray(size: Int): Array<msg?> {
            return arrayOfNulls(size)
        }

        const val TYPE_RECEIVED=0
        const val TYPE_SENT=1
    }
}

fruit:

package com.example.yzltest3

class fruit(val name:String, val imageid:Int, var fruittext:String) {
}

fruitadapter(Listview):

package com.example.yzltest3

import android.app.Activity
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ArrayAdapter
import android.widget.ImageView
import android.widget.TextView

class fruitadapter(activity: Activity,val resourceid:Int,data:List<fruit>):ArrayAdapter<fruit>(activity,resourceid,data) {
    inner class viewholder(val fruitimage:ImageView,val fruitname:TextView)
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View {
        val view:View
        val viewholder:viewholder
        if (convertView==null){
            view=LayoutInflater.from(context).inflate(resourceid,parent,false)
            val fruitimage:ImageView=view.findViewById(R.id.fruitImage)
            val fruiname:TextView=view.findViewById(R.id.fruitname)
            viewholder=viewholder(fruitimage,fruiname)
            view.tag=viewholder
        }else{
            view=convertView
            viewholder=view.tag as viewholder
        }

        val fruit=getItem(position)//获取当前的fruit实例
        if (fruit!=null){
            viewholder.fruitimage.setImageResource(fruit.imageid)
            viewholder.fruitname.text=fruit.name
        }
        return  view
    }
}

fruitadapter1(Recylerview):

package com.example.yzltest3

import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.ImageView
import android.widget.TextView
import android.widget.Toast
import androidx.recyclerview.widget.RecyclerView

class fruitadapter1(val fruitlist: List<fruit>, val onItemClick: (fruit) -> Unit) : RecyclerView.Adapter<fruitadapter1.viewholder>() {
    inner class viewholder(view: View) : RecyclerView.ViewHolder(view) {
        val fruitimage: ImageView = view.findViewById(R.id.fruitImage)
        val fruitname: TextView = view.findViewById(R.id.fruitname)
        val fruittext:TextView=view.findViewById(R.id.fruittext)
        init {
            view.setOnClickListener {
                val position = adapterPosition
                if (position != RecyclerView.NO_POSITION) {
                    onItemClick(fruitlist[position])
                }
            }
        }
    }

    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): viewholder {
        val view=LayoutInflater.from(parent.context).inflate(R.layout.fruit_item,parent,false)
        return viewholder(view)
    }

    override fun onBindViewHolder(holder: viewholder, position: Int) {
        val fruit=fruitlist[position]
        holder.fruitimage.setImageResource(fruit.imageid)
        holder.fruitname.text=fruit.name
        holder.fruittext.text=fruit.fruittext
    }

    override fun getItemCount()=fruitlist.size
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值