提示:
•
提示:圆形头像用
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
}