android - 如何在 Kotlin 中将 listView 转换为 RecyclerView
问题描述
我在使用 listView 时遇到问题,因为我在 listview 中显示了许多图像(关于内存)
我需要将 listview 转换为 recyclerview
问题:
当我在手机上显示图像时,使用最后一个视图,你做了很多内存阻塞,这导致应用程序停止,所以我想将 List View 转换为 RecycleView。
主要活动:
package com.masreta87.hussain
import android.app.Activity
import android.content.pm.PackageManager
import android.graphics.Bitmap
import android.graphics.drawable.BitmapDrawable
import android.os.Build
import androidx.appcompat.app.AppCompatActivity
import android.os.Bundle
import android.os.Environment
import android.view.View
import android.widget.AdapterView
import android.widget.ImageView
import android.widget.ListView
import android.widget.Toast
import androidx.core.app.ActivityCompat
import androidx.core.content.ContextCompat
import androidx.core.view.get
import java.io.File
import java.io.FileOutputStream
import java.io.OutputStream
import java.lang.Exception
import java.util.jar.Manifest
import androidx.core.content.ContextCompat.getSystemService
import android.icu.lang.UCharacter.GraphemeClusterBreak.T
import androidx.core.app.ComponentActivity.ExtraData
import androidx.core.content.ContextCompat.getSystemService
import android.icu.lang.UCharacter.GraphemeClusterBreak.T
import android.util.Log
import kotlinx.android.synthetic.*
class MainActivity : AppCompatActivity() {
lateinit var Img:ListView
lateinit var ImgArr:ArrayList<DataImg>
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
Img=findViewById(R.id.listviewB)
ImgArr=ArrayList()
ImgArr.add(DataImg(R.drawable.h))
ImgArr.add(DataImg(R.drawable.hh))
ImgArr.add(DataImg(R.drawable.hhh))
ImgArr.add(DataImg(R.drawable.v2))
ImgArr.add(DataImg(R.drawable.v3))
ImgArr.add(DataImg(R.drawable.v4))
ImgArr.add(DataImg(R.drawable.v5))
ImgArr.add(DataImg(R.drawable.v6))
//ImgArr.add(DataImg(R.drawable.v7))
ImgArr.add(DataImg(R.drawable.v8))
ImgArr.add(DataImg(R.drawable.v9))
Img.adapter=customAdapter(applicationContext,ImgArr)
Img.setOnItemClickListener{parent:AdapterView<*>, view:View, position:Int, id:Long ->
var ImgNa=ImgArr.get(position).image.toString()
Log.d("this",ImgNa)
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M){
if (ContextCompat.checkSelfPermission(this,android.Manifest.permission.WRITE_EXTERNAL_STORAGE )
!=PackageManager.PERMISSION_GRANTED){
ActivityCompat.requestPermissions(this, arrayOf(android.Manifest.permission.WRITE_EXTERNAL_STORAGE)
,100)
}else{
saveImageToStorage(ImgNa)
}
}else{
saveImageToStorage(ImgNa)
}
}
}
override fun onRequestPermissionsResult(
requestCode: Int,
permissions: Array<out String>,
grantResults: IntArray
) {
if (requestCode==100){
if (grantResults.isNotEmpty() && grantResults[0]==PackageManager.PERMISSION_GRANTED){
// saveImageToStorage(ImgNa)
}else{
Toast.makeText(this,"No Permission for save",Toast.LENGTH_SHORT).show()
}
}
}
public fun saveImageToStorage(ImgNa:String){
val externalStorageState=Environment.getExternalStorageState()
if (externalStorageState.equals(Environment.MEDIA_MOUNTED)){
val storeDirectory=Environment.getExternalStorageDirectory().toString()
val rnds = (1000..100000000000).random().toString()
val file=File(storeDirectory,"$rnds.png")//Namephoto
try {
Log.d("output",ImgNa)
val stream:OutputStream =FileOutputStream(file)
var drawable=ContextCompat.getDrawable(applicationContext,ImgNa.toInt()) //edit
var bitmap=(drawable as BitmapDrawable).bitmap
bitmap.compress(Bitmap.CompressFormat.PNG,100,stream)
stream.flush()
stream.close()
Toast.makeText(this,"Image Saved",Toast.LENGTH_LONG).show()
}catch (e:Exception){
e.printStackTrace()
}
}else{
Toast.makeText(this,"unable to access the storage",Toast.LENGTH_SHORT).show()
}
}
}
和customAdapter
package com.masreta87.hussain
import android.content.Context
import android.view.LayoutInflater
import android.view.View
import android.view.ViewGroup
import android.widget.BaseAdapter
import android.widget.ImageView
class customAdapter(var context: Context,var data:ArrayList<DataImg>) :BaseAdapter(){
private class ViewHolder(row:View?){
var ivImage:ImageView
init {
this.ivImage=row?.findViewById(R.id.imageViewN) as ImageView
}
}
override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {
var view:View?
var viewHolder:ViewHolder
if(convertView==null){
var layout=LayoutInflater.from(context)
view=layout.inflate(R.layout.listview_item,parent,false)
viewHolder=ViewHolder(view)
view.tag=viewHolder
}else{
view=convertView
viewHolder=view.tag as ViewHolder
}
var data:DataImg=getItem(position) as DataImg
viewHolder.ivImage.setImageResource(data.image)
return view as View
}
override fun getItem(position: Int): Any {
return data.get(position)
}
override fun getItemId(position: Int): Long {
return position.toLong()
}
override fun getCount(): Int {
return data.count()
}
}
和数据图:
package com.masreta87.hussain
class DataImg(var image:Int) {
}
活动_Main.xml:
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<ListView
android:id="@+id/listviewB"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
listview_item.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/imageViewN"
android:background="@drawable/image_border"
android:layout_width="match_parent"
android:scaleType="fitXY"
android:layout_height="200dp"
/>
</LinearLayout>
解决方案
第一次改变你的activity_Main.xml:
<?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:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<RecyclerView
android:id="@+id/recycler_view"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
</RelativeLayout>
然后你必须像这样为 RecyclerView 创建一个适配器:
class CustomAdapter(private val activity: Context?, private val arrData: List<DataImg>) : RecyclerView.Adapter<CustomAdapter.ViewHolder>() {
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder {
var itemView: View? = null
itemView = LayoutInflater.from(activity)
.inflate(R.layout.listview_item, parent, false)
return ViewHolder(itemView)
}
override fun onBindViewHolder(holder: ViewHolder, i: Int) {
val model = arrData[i]
}
override fun getItemCount(): Int {
return arrData.size
}
class ViewHolder(view: View?) : RecyclerView.ViewHolder(view!!) {
}
}
现在在您的主要活动中,您必须为 RecyclerView 设置布局管理器,并且必须将 Adapter 与它绑定
recyclerViewSearchList = findViewById(R.id.recycler_view)
recyclerView.layoutManager = LinearLayoutManager(context, LinearLayoutManager.VERTICAL, false)
recyclerViewSearchList.adapter = CustomAdapter(MainActivity.this, ImgArr)
推荐阅读
- python - 我的手风琴切换代码不起作用
- python-3.x - 如何在本地运行 apache Beam?
- filenames - GNU Make:删除第一个点后文件名的所有部分
- php - 如何修改对象转换为数组的方式?
- android - 使用 smack 发送消息时丢失消息
- vue.js - v-text-field 没有占据容器的整个宽度
- angular - 用户输入日期时如何自动添加点?
- java - 在 Appium 的亚马逊应用程序中切换上下文
- reactjs - 如何在功能组件中调用鼠标悬停的两个函数?
- asp.net-web-api - 如何在 Xamarin Forms 中使用 Web API 将配置文件图像存储到 SQL Server