Commit 4e260ff2 authored by wanglei's avatar wanglei

Files页面

parent 8f114531
...@@ -20,6 +20,9 @@ ...@@ -20,6 +20,9 @@
android:supportsRtl="true" android:supportsRtl="true"
android:theme="@style/Theme.SimpleFilesManager" android:theme="@style/Theme.SimpleFilesManager"
tools:targetApi="31"> tools:targetApi="31">
<activity
android:name=".simplelist.SimpleListActivity"
android:exported="false" />
<activity <activity
android:name=".simplegrid.SimpleGridActivity" android:name=".simplegrid.SimpleGridActivity"
android:exported="false" /> android:exported="false" />
...@@ -49,6 +52,17 @@ ...@@ -49,6 +52,17 @@
<category android:name="android.intent.category.LAUNCHER" /> <category android:name="android.intent.category.LAUNCHER" />
</intent-filter> </intent-filter>
</activity> </activity>
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.provider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
</application> </application>
</manifest> </manifest>
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpleCommon package com.zxhy.simplefilesmanager.simpleCommon
import android.content.Context
import android.os.Environment
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.async
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import java.io.File
import java.util.LinkedList
import kotlin.reflect.KFunction0
abstract class SimpleCommonViewModel : ViewModel() { abstract class SimpleCommonViewModel : ViewModel() {
private fun linkedWhileFolder(folder: File, onDo: ((file: File) -> Unit)?) {
//添加第一层文件到链表
val linkList = LinkedList<File>()
val fileList = folder.listFiles()
fileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
onDo?.invoke(it)
}
}
//链表取文件
var tempFile: File
while (!linkList.isEmpty()) {
tempFile = linkList.removeFirst()
val tempFileList = tempFile.listFiles()
tempFileList?.forEach {
if (it.isDirectory) {
linkList.add(it)
} else {
onDo?.invoke(it)
}
}
}
}
fun deleteFiles(files: List<File>, action: () -> Unit) =
viewModelScope.launch(Dispatchers.IO) {
runCatching {
files.forEach {
if (it.exists()) it.delete()
}
action.invoke()
}
}
/**
* @param filter 过滤条件
* @param convert 抓换为JoFileJo的转换方法
* @param onDo 扫描部分数据执行
* @param onFinish 扫描完成执行
*/
fun <T : JoFileJo> loadFile(
filter: (file: File) -> Boolean,
convert: (file: File) -> T,
onDo: (list: List<T>) -> Unit,
onFinish: (list: List<T>) -> Unit
) = viewModelScope.launch(Dispatchers.IO) {
val root = Environment.getExternalStorageDirectory()
val resultList = arrayListOf<T>()
var firstSend = false
linkedWhileFolder(root) { file ->
if (filter(file)) {
resultList.add(convert(file))
if (resultList.size == 20 && !firstSend) {
val mainList = arrayListOf<T>()
mainList.addAll(resultList)
//这里onDo切换到main主协程,避免IO协程里的数据和main协程里的数据共用同一对象
onDo.invoke(mainList)
resultList.clear()
firstSend = true
}
}
}
onFinish.invoke(resultList)
}
} }
\ No newline at end of file
...@@ -42,12 +42,12 @@ abstract class JoCommonJoAdapter<T : ViewHolder, E : JoFileJo>() : RecyclerView. ...@@ -42,12 +42,12 @@ abstract class JoCommonJoAdapter<T : ViewHolder, E : JoFileJo>() : RecyclerView.
} }
fun getSelectData(): List<E> { fun getSelectData(): List<E> {
return joFileList.filter { it.isSelect } return joFileList.filter { it.isSelected }
} }
fun toggleSelect(select: Boolean) { fun toggleSelect(select: Boolean) {
joFileList.forEach { fileBean -> joFileList.forEach { fileBean ->
fileBean.isSelect = select fileBean.isSelected = select
} }
notifyDataSetChanged() notifyDataSetChanged()
} }
......
package com.zxhy.simplefilesmanager.simpledata package com.zxhy.simplefilesmanager.simpledata
import android.net.Uri import java.io.File
abstract class JoFileJo( abstract class JoFileJo(
val name: String = "", var fName: String = "",
val jisd: String = "", val jisd: String = "",
var isSelect: Boolean = false, var isSelected: Boolean = false,
val sdadsd: Int = 0, val sdadsd: Int = 0,
val sdsadgb: Float = 0.2f, val sdsadgb: Float = 0.2f,
var path: String = ""
) { ) {
fun toFile(): File {
return File(path)
}
override fun equals(other: Any?): Boolean { override fun equals(other: Any?): Boolean {
if (this === other) return true if (this === other) return true
if (javaClass != other?.javaClass) return false if (javaClass != other?.javaClass) return false
other as JoFileJo other as JoFileJo
if (name != other.name) return false if (fName != other.fName) return false
if (jisd != other.jisd) return false if (jisd != other.jisd) return false
if (isSelect != other.isSelect) return false if (isSelected != other.isSelected) return false
if (sdadsd != other.sdadsd) return false if (sdadsd != other.sdadsd) return false
if (sdsadgb != other.sdsadgb) return false if (sdsadgb != other.sdsadgb) return false
...@@ -26,11 +31,13 @@ abstract class JoFileJo( ...@@ -26,11 +31,13 @@ abstract class JoFileJo(
} }
override fun hashCode(): Int { override fun hashCode(): Int {
var result = name.hashCode() var result = fName.hashCode()
result = 31 * result + jisd.hashCode() result = 31 * result + jisd.hashCode()
result = 31 * result + isSelect.hashCode() result = 31 * result + isSelected.hashCode()
result = 31 * result + sdadsd result = 31 * result + sdadsd
result = 31 * result + sdsadgb.hashCode() result = 31 * result + sdsadgb.hashCode()
return result return result
} }
} }
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledata
import android.net.Uri
import java.io.File
class JoGridFileJo(
val sdad: String = "",
var uri: Uri = Uri.EMPTY,
) : JoFileJo() {
companion object {
fun joGridFileJo(file: File): JoGridFileJo {
return JoGridFileJo().apply {
path = file.absolutePath
fName = file.name
}
}
fun File.joGridFileJo2(): JoGridFileJo {
return JoGridFileJo().apply {
fName = name
}
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simpledata
class JoListFileJo(
val timeE: String = "",
val sss: Int = 0,
) : JoFileJo() {
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplefile package com.zxhy.simplefilesmanager.simplefile
import android.os.Bundle import android.os.Bundle
import android.util.Log
import androidx.fragment.app.Fragment import androidx.fragment.app.Fragment
import android.view.LayoutInflater import android.view.LayoutInflater
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
import androidx.fragment.app.viewModels import androidx.fragment.app.viewModels
import androidx.lifecycle.lifecycleScope import androidx.lifecycle.lifecycleScope
import androidx.navigation.fragment.findNavController
import com.zxhy.simplefilesmanager.R import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.FragmentSimpleFileBinding import com.zxhy.simplefilesmanager.databinding.FragmentSimpleFileBinding
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage
import com.zxhy.simplefilesmanager.simplejoke.IntentEx.systemActionView
import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch import kotlinx.coroutines.launch
...@@ -37,7 +37,9 @@ class SimpleFileFragment() : Fragment() { ...@@ -37,7 +37,9 @@ class SimpleFileFragment() : Fragment() {
override fun onViewCreated(view: View, savedInstanceState: Bundle?) { override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
// Log.e(TAG, "onViewCreated") // Log.e(TAG, "onViewCreated")
super.onViewCreated(view, savedInstanceState) super.onViewCreated(view, savedInstanceState)
adapter = SimpleRecentAdapter(requireContext()) adapter = SimpleRecentAdapter(requireContext()) {
systemActionView(requireContext(), it)
}
binding.rv.adapter = adapter binding.rv.adapter = adapter
viewMode.joloadjoRecentImage(requireContext()) { list -> viewMode.joloadjoRecentImage(requireContext()) { list ->
lifecycleScope.launch(Dispatchers.Main) { lifecycleScope.launch(Dispatchers.Main) {
...@@ -45,6 +47,18 @@ class SimpleFileFragment() : Fragment() { ...@@ -45,6 +47,18 @@ class SimpleFileFragment() : Fragment() {
adapter.setData(datas) adapter.setData(datas)
} }
} }
binding.ivImage.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "IMAGE")
}
findNavController().navigate(R.id.simpleGridActivity, args)
}
binding.ivVideo.setOnClickListener {
val args = Bundle().apply {
putString("Tittle", "VIDEO")
}
findNavController().navigate(R.id.simpleGridActivity, args)
}
} }
......
package com.zxhy.simplefilesmanager.simplefile package com.zxhy.simplefilesmanager.simplefile
import android.content.Context import android.content.Context
import android.net.Uri
import android.view.RoundedCorner import android.view.RoundedCorner
import android.view.View import android.view.View
import android.view.ViewGroup import android.view.ViewGroup
...@@ -18,8 +19,10 @@ import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage ...@@ -18,8 +19,10 @@ import com.zxhy.simplefilesmanager.simpledata.JoJoRecentImage
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx.dp2px import com.zxhy.simplefilesmanager.simplejoke.DipPxEx.dp2px
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleRecentAdapter(val context: Context) : class SimpleRecentAdapter(
JoCommonJoAdapter<SimpleRecentAdapter.AA, JoJoRecentImage>() { val context: Context,
private val itemClick: (uri: Uri) -> Unit
) : JoCommonJoAdapter<SimpleRecentAdapter.AA, JoJoRecentImage>() {
private val options = private val options =
RequestOptions() RequestOptions()
.transform(CenterCrop(), RoundedCorners(dp2px(context, R.dimen.dp_8))) .transform(CenterCrop(), RoundedCorners(dp2px(context, R.dimen.dp_8)))
...@@ -39,5 +42,8 @@ class SimpleRecentAdapter(val context: Context) : ...@@ -39,5 +42,8 @@ class SimpleRecentAdapter(val context: Context) :
.load(data.uri) .load(data.uri)
.apply(options) .apply(options)
.into(holder.binding.iv) .into(holder.binding.iv)
holder.binding.root.setOnClickListener {
itemClick.invoke(data.uri)
}
} }
} }
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplegrid package com.zxhy.simplefilesmanager.simplegrid
import android.content.Intent
import android.content.Intent.FLAG_ACTIVITY_SINGLE_TOP
import android.os.Bundle import android.os.Bundle
import android.util.Log
import android.view.View
import androidx.activity.enableEdgeToEdge import androidx.activity.enableEdgeToEdge
import androidx.activity.viewModels
import androidx.appcompat.app.AppCompatActivity import androidx.appcompat.app.AppCompatActivity
import androidx.core.content.FileProvider
import androidx.core.view.ViewCompat import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat import androidx.core.view.WindowInsetsCompat
import androidx.core.view.isVisible
import androidx.lifecycle.lifecycleScope
import com.zxhy.simplefilesmanager.R import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivitySimpleGridBinding import com.zxhy.simplefilesmanager.databinding.ActivitySimpleGridBinding
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simplejoke.IntentEx.systemActionView
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class SimpleGridActivity : AppCompatActivity() { class SimpleGridActivity : AppCompatActivity() {
private lateinit var binding: ActivitySimpleGridBinding private lateinit var binding: ActivitySimpleGridBinding
private val viewModel: SimpleGridViewModel by viewModels()
private lateinit var adapter: SimpleGridAdapter
private var tittle: String = ""
private val TAG = "SimpleGridActivity"
override fun onCreate(savedInstanceState: Bundle?) { override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState) super.onCreate(savedInstanceState)
enableEdgeToEdge() enableEdgeToEdge()
...@@ -20,5 +38,58 @@ class SimpleGridActivity : AppCompatActivity() { ...@@ -20,5 +38,58 @@ class SimpleGridActivity : AppCompatActivity() {
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom) v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets insets
} }
tittle = intent.extras?.getString("Tittle") ?: ""
binding.tvTittle.text = tittle
binding.flBack.setOnClickListener { finish() }
adapter = SimpleGridAdapter(tittle == "VIDEO", this,
selectClick = { count ->
if (count == 0) {
binding.tvItems.visibility = View.INVISIBLE
} else {
binding.tvItems.visibility = View.VISIBLE
binding.tvItems.text = this.getString(R.string.select_d_items, count)
}
},
itemClick = { path ->
systemActionView(this, path, tittle)
})
binding.rv.adapter = adapter
if (tittle == "IMAGE") {
viewModel.loadImage(::onFistRefresh, ::onCompleteRefresh)
}
if (tittle == "VIDEO") {
viewModel.loadVideo(::onFistRefresh, ::onCompleteRefresh)
}
binding.flDelete.setOnClickListener {
val datas = adapter.getSelectData()
val files = datas.map { it.toFile() }
viewModel.deleteFiles(files) {
lifecycleScope.launch(Dispatchers.Main) {
adapter.removeData(datas)
}
}
}
} }
private fun onFistRefresh(list: List<JoGridFileJo>) = lifecycleScope.launch(Dispatchers.Main) {
if (list.isNotEmpty()) {
binding.pb.visibility = View.GONE
binding.rv.visibility = View.VISIBLE
binding.flDelete.visibility = View.VISIBLE
adapter.setData(list)
}
}
private fun onCompleteRefresh(list: List<JoGridFileJo>) =
lifecycleScope.launch(Dispatchers.Main) {
if (list.isNotEmpty()) {
binding.pb.visibility = View.GONE
binding.rv.visibility = View.VISIBLE
binding.flDelete.visibility = View.VISIBLE
adapter.addData(list)
}
}
} }
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplegrid
import android.content.Context
import android.net.Uri
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ItemJoIVJoSelectBinding
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simpledata.JoFileJo
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleGridAdapter(
private val isVideo: Boolean = false,
private val context: Context,
private val selectClick: (count: Int) -> Unit,
private val itemClick: (path: String) -> Unit,
) : JoCommonJoAdapter<SimpleGridAdapter.HH, JoFileJo>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(DipPxEx.dp2px(context, R.dimen.dp_8)))
class HH(view: View) : ViewHolder(view) {
val binding = ItemJoIVJoSelectBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): HH {
return HH(R.layout.item_jo_i_v_jo_select.jojoinflate(parent))
}
override fun onBindViewHolder(holder: HH, position: Int) {
}
override fun onBindViewHolder(holder: HH, position: Int, payloads: MutableList<Any>) {
val context = holder.binding.root.context
val data = joFileList[position]
if (payloads.isEmpty()) {
if (isVideo) holder.binding.ivCamera.visibility = View.VISIBLE
Glide.with(context)
.load(data.path)
.apply(options)
.into(holder.binding.iv)
holder.binding.ivSelector.isSelected = data.isSelected
holder.binding.ivSelector.setOnClickListener {
data.isSelected = !data.isSelected
holder.binding.ivSelector.isSelected = data.isSelected
notifyItemChanged(position, "sumdk")
selectClick.invoke(getSelectData().size)
}
holder.binding.root.setOnClickListener {
itemClick.invoke(data.path)
}
} else {
holder.binding.ivSelector.isSelected = data.isSelected
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplegrid
import androidx.lifecycle.viewModelScope
import com.zxhy.simplefilesmanager.simpleCommon.SimpleCommonViewModel
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo
import com.zxhy.simplefilesmanager.simpledata.JoGridFileJo.Companion.joGridFileJo
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.launch
import java.io.File
class SimpleGridViewModel : SimpleCommonViewModel() {
private fun isImage(file: File): Boolean {
return file.name.contains(".jpg") or file.name.contains(".png") or file.name.contains(".gif")
}
private fun isVideo(file: File): Boolean {
return file.name.contains(".mp4") or
file.name.contains(".avi") or
file.name.contains(".flv") or
file.name.contains(".rmvb") or
file.name.contains(".mkv")
}
fun loadImage(
onDo: (list: List<JoGridFileJo>) -> Unit,
onFinish: (list: List<JoGridFileJo>) -> Unit
) = loadFile(::isImage, ::joGridFileJo, onDo, onFinish)
fun loadVideo(
onDo: (list: List<JoGridFileJo>) -> Unit,
onFinish: (list: List<JoGridFileJo>) -> Unit
) = loadFile(::isVideo, ::joGridFileJo, onDo, onFinish)
}
\ No newline at end of file
...@@ -6,12 +6,14 @@ import android.net.Uri ...@@ -6,12 +6,14 @@ import android.net.Uri
import android.os.Build import android.os.Build
import android.provider.Settings import android.provider.Settings
import androidx.annotation.RequiresApi import androidx.annotation.RequiresApi
import androidx.core.content.FileProvider
import java.io.File
/** /**
* 访问所有文件权限设置界面 * 访问所有文件权限设置界面
* https://blog.csdn.net/qq_17766199/article/details/115351949 * https://blog.csdn.net/qq_17766199/article/details/115351949
*/ */
object IntentEx{ object IntentEx {
@RequiresApi(Build.VERSION_CODES.R) @RequiresApi(Build.VERSION_CODES.R)
fun settingManageExternalStorage(uri: Uri? = null): Intent { fun settingManageExternalStorage(uri: Uri? = null): Intent {
val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri) val intent = Intent(Settings.ACTION_MANAGE_APP_ALL_FILES_ACCESS_PERMISSION, uri)
...@@ -32,4 +34,27 @@ object IntentEx{ ...@@ -32,4 +34,27 @@ object IntentEx{
return Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS) return Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS)
.setData(Uri.fromParts("package", packageName, null)) .setData(Uri.fromParts("package", packageName, null))
} }
fun systemActionView(context: Context, path: String, tittle: String = "IMAGE") {
val uri =
FileProvider.getUriForFile(context, "${context.packageName}.provider", File(path))
val intent = Intent().apply {
action = Intent.ACTION_VIEW
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
val type = if (tittle == "IMAGE") "image/*" else "video/*"
setDataAndType(uri, type)
}
context.startActivity(intent)
}
fun systemActionView(context: Context, uri: Uri, tittle: String = "IMAGE") {
val intent = Intent().apply {
action = Intent.ACTION_VIEW
flags = Intent.FLAG_GRANT_READ_URI_PERMISSION
addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP)
setDataAndType(uri, if (tittle == "IMAGE") "image/*" else "video/*")
}
context.startActivity(intent)
}
} }
package com.zxhy.simplefilesmanager.simplelist
import android.os.Bundle
import androidx.activity.enableEdgeToEdge
import androidx.appcompat.app.AppCompatActivity
import androidx.core.view.ViewCompat
import androidx.core.view.WindowInsetsCompat
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ActivitySimpleListBinding
class SimpleListActivity : AppCompatActivity() {
private lateinit var binding: ActivitySimpleListBinding
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
enableEdgeToEdge()
binding = ActivitySimpleListBinding.inflate(layoutInflater)
setContentView(binding.root)
ViewCompat.setOnApplyWindowInsetsListener(findViewById(R.id.main)) { v, insets ->
val systemBars = insets.getInsets(WindowInsetsCompat.Type.systemBars())
v.setPadding(systemBars.left, systemBars.top, systemBars.right, systemBars.bottom)
insets
}
}
}
\ No newline at end of file
package com.zxhy.simplefilesmanager.simplelist
import android.content.Context
import android.view.View
import android.view.ViewGroup
import androidx.recyclerview.widget.RecyclerView.ViewHolder
import com.bumptech.glide.Glide
import com.bumptech.glide.load.resource.bitmap.CenterCrop
import com.bumptech.glide.load.resource.bitmap.RoundedCorners
import com.bumptech.glide.request.RequestOptions
import com.zxhy.simplefilesmanager.R
import com.zxhy.simplefilesmanager.databinding.ItemJoListFileJoBinding
import com.zxhy.simplefilesmanager.simpleadpter.JoCommonJoAdapter
import com.zxhy.simplefilesmanager.simpledata.JoListFileJo
import com.zxhy.simplefilesmanager.simplejoke.DipPxEx
import com.zxhy.simplefilesmanager.simplejoke.JoXmljoEx.jojoinflate
class SimpleListAdapter(val context: Context) :
JoCommonJoAdapter<SimpleListAdapter.CC, JoListFileJo>() {
private val options =
RequestOptions()
.transform(CenterCrop(), RoundedCorners(DipPxEx.dp2px(context, R.dimen.dp_8)))
class CC(view: View) : ViewHolder(view) {
val binding = ItemJoListFileJoBinding.bind(view)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): CC {
return CC(R.layout.item_jo_list_file_jo.jojoinflate(parent))
}
override fun onBindViewHolder(holder: CC, position: Int) {
}
override fun onBindViewHolder(holder: CC, position: Int, payloads: MutableList<Any>) {
val data = joFileList[position]
if (payloads.isEmpty()) {
Glide.with(context)
.load(data.path)
.apply(options)
.into(holder.binding.iv)
} else {
super.onBindViewHolder(holder, position, payloads)
}
}
}
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/afa_6956" android:state_selected="true" />
<item android:drawable="@mipmap/das_58985" android:state_selected="false" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@mipmap/low_87955" android:state_selected="false" />
<item android:drawable="@mipmap/wkeoi_78956" android:state_selected="true" />
</selector>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools" xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/main" android:id="@+id/main"
android:layout_width="match_parent" android:layout_width="match_parent"
android:layout_height="match_parent" android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".simplegrid.SimpleGridActivity"> tools:context=".simplegrid.SimpleGridActivity">
</androidx.constraintlayout.widget.ConstraintLayout> <FrameLayout
\ No newline at end of file android:layout_width="match_parent"
android:layout_height="36dp"
app:layout_constraintTop_toTopOf="parent">
<FrameLayout
android:id="@+id/fl_back"
android:layout_width="65dp"
android:layout_height="match_parent">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_marginStart="12dp"
android:src="@mipmap/dsf_5978897" />
</FrameLayout>
<TextView
android:id="@+id/tv_tittle"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:textColor="#FF333333"
android:textSize="16sp"
android:textStyle="bold" />
<FrameLayout
android:id="@+id/fl_delete"
android:layout_width="65dp"
android:layout_height="match_parent"
android:layout_gravity="end"
android:visibility="gone">
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical|end"
android:layout_marginEnd="12dp"
android:src="@mipmap/kkwoe_89795" />
</FrameLayout>
</FrameLayout>
<TextView
android:id="@+id/tv_items"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="center_horizontal"
android:text="@string/select_d_items"
android:visibility="invisible" />
<FrameLayout
android:layout_width="match_parent"
android:layout_height="match_parent">
<androidx.recyclerview.widget.RecyclerView
android:id="@+id/rv"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:layout_gravity="center_horizontal"
android:layout_marginBottom="8dp"
android:overScrollMode="never"
android:visibility="invisible"
app:layoutManager="androidx.recyclerview.widget.GridLayoutManager"
app:spanCount="3"
tools:listitem="@layout/item_jo_i_v_jo_select" />
<ProgressBar
android:id="@+id/pb"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_gravity="center"
android:indeterminate="true"
android:indeterminateTint="#5BBAFF"
android:indeterminateTintMode="src_atop" />
</FrameLayout>
</LinearLayout>
\ No newline at end of file
<?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=".simplelist.SimpleListActivity">
</androidx.constraintlayout.widget.ConstraintLayout>
\ No newline at end of file
...@@ -50,10 +50,12 @@ ...@@ -50,10 +50,12 @@
android:id="@+id/iv_image" android:id="@+id/iv_image"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginStart="20dp"
android:layout_marginTop="16dp" android:layout_marginTop="16dp"
android:src="@mipmap/sgga_999997" android:src="@mipmap/sgga_999997"
app:layout_constraintEnd_toStartOf="@+id/iv_video" app:layout_constraintEnd_toStartOf="@+id/iv_video"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="parent" app:layout_constraintStart_toStartOf="parent"
app:layout_constraintTop_toTopOf="parent" /> app:layout_constraintTop_toTopOf="parent" />
...@@ -117,6 +119,7 @@ ...@@ -117,6 +119,7 @@
android:id="@+id/iv_large_file" android:id="@+id/iv_large_file"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:src="@mipmap/fasd_589256" android:src="@mipmap/fasd_589256"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
...@@ -139,12 +142,15 @@ ...@@ -139,12 +142,15 @@
android:id="@+id/iv_zip" android:id="@+id/iv_zip"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginStart="20dp"
android:layout_marginBottom="34dp" android:layout_marginBottom="34dp"
android:src="@mipmap/sfz_6985" android:src="@mipmap/sfz_6985"
app:layout_constraintBottom_toBottomOf="parent" app:layout_constraintBottom_toBottomOf="parent"
app:layout_constraintEnd_toStartOf="@+id/iv_apk" app:layout_constraintEnd_toStartOf="@+id/iv_apk"
app:layout_constraintHorizontal_bias="0.5" app:layout_constraintHorizontal_bias="0.5"
app:layout_constraintStart_toStartOf="parent" /> app:layout_constraintHorizontal_chainStyle="spread_inside"
app:layout_constraintStart_toStartOf="parent"
tools:ignore="ContentDescription" />
<TextView <TextView
android:layout_width="wrap_content" android:layout_width="wrap_content"
...@@ -206,6 +212,7 @@ ...@@ -206,6 +212,7 @@
android:id="@+id/iv_empty_file" android:id="@+id/iv_empty_file"
android:layout_width="40dp" android:layout_width="40dp"
android:layout_height="40dp" android:layout_height="40dp"
android:layout_marginEnd="20dp"
android:src="@mipmap/koas_87985" android:src="@mipmap/koas_87985"
app:layout_constraintBottom_toBottomOf="@id/iv_zip" app:layout_constraintBottom_toBottomOf="@id/iv_zip"
app:layout_constraintEnd_toEndOf="parent" app:layout_constraintEnd_toEndOf="parent"
......
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_margin="6dp">
<ImageView
android:id="@+id/iv"
android:layout_width="match_parent"
android:layout_height="match_parent" />
<ImageView
android:id="@+id/iv_camera"
android:layout_width="28dp"
android:layout_height="24dp"
android:layout_gravity="center"
android:src="@mipmap/wkoe_41879"
android:visibility="invisible" />
<ImageView
android:id="@+id/iv_selector"
android:layout_width="30dp"
android:layout_height="30dp"
android:layout_gravity="end|bottom"
android:layout_margin="5dp"
android:src="@drawable/bg_grid_selector" />
</FrameLayout>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="horizontal">
<ImageView
android:id="@+id/iv"
android:layout_width="40dp"
android:layout_height="40dp"
android:layout_gravity="center_vertical"
tools:ignore="ContentDescription" />
<LinearLayout
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_gravity="center_vertical"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginBottom="4dp"
android:text="Image"
android:textColor="#FF333333"
android:textSize="14sp"
tools:ignore="HardcodedText" />
<TextView
android:id="@+id/tv_info"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="4dp"
android:text="January 5, 2024 2 itmes"
android:textColor="#FF999999"
android:textSize="12sp"
tools:ignore="HardcodedText" />
</LinearLayout>
<ImageView
android:layout_width="24dp"
android:layout_height="24dp"
android:layout_gravity="center_vertical"
android:layout_margin="12dp"
android:src="@drawable/bg_list_selector" />
</LinearLayout>
\ No newline at end of file
...@@ -25,4 +25,10 @@ ...@@ -25,4 +25,10 @@
app:uri="https://www.zxhy.com/simplefile/" /> app:uri="https://www.zxhy.com/simplefile/" />
</fragment> </fragment>
<activity
android:id="@+id/simpleGridActivity"
android:name="com.zxhy.simplefilesmanager.simplegrid.SimpleGridActivity"
android:label="activity_simple_grid"
tools:layout="@layout/activity_simple_grid">
</activity>
</navigation> </navigation>
\ No newline at end of file
...@@ -2,4 +2,5 @@ ...@@ -2,4 +2,5 @@
<string name="app_name">Simple Files Manager</string> <string name="app_name">Simple Files Manager</string>
<!-- TODO: Remove or change this placeholder text --> <!-- TODO: Remove or change this placeholder text -->
<string name="hello_blank_fragment">Hello blank fragment</string> <string name="hello_blank_fragment">Hello blank fragment</string>
<string name="select_d_items">Select %d items</string>
</resources> </resources>
\ No newline at end of file
<?xml version="1.0" encoding="utf-8"?>
<paths>
<!--内置SD卡 Environment.getExternalStorageDirectory() .表示共享所有的目录,也可以指定共享的目录-->
<external-path
name="external-path"
path="."/>
<!--内置SD卡 Context.getExternalCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
<external-cache-path
name="external-cache-path"
path="."/>
<!--内置SD卡 Context.getExternalFilesDir(null) .表示共享所有的目录,也可以指定共享的目录-->
<external-files-path
name="external-files-path"
path="."/>
<!--data目录下 Context.getFilesDir() .表示共享所有的目录,也可以指定共享的目录-->
<files-path
name="files_path"
path="."/>
<!--data缓存目录 Context.getCacheDir() .表示共享所有的目录,也可以指定共享的目录-->
<cache-path
name="cache-path"
path="."/>
<!--这个标签Android官方文档中是没有提及,Android设备的根目录,该目录下包含着手机内部存储器,外置SD卡等所有文件的目录-->
<root-path
name="name"
path="."/>
<external-path
name="external_storage_root"
path="." />
</paths>
\ No newline at end of file
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment