android 实用的小技巧(RecyclerView 数据排序 -- SortedList)
Posted android超级兵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了android 实用的小技巧(RecyclerView 数据排序 -- SortedList)相关的知识,希望对你有一定的参考价值。
好久没写博客了,最近工作事情比较多,没有状态,今天忽然用到一个好玩的东西,拿来记录一下下~~
今日完成效果图
⚠️: 我的数据是这么初始化的:
需求
- 可以根据id来实现正序,以及倒叙排序
- 添加/添加多个 也根据id来添加
- 添加若重复 则覆盖之前的数据
- 删除时候删除第0个位置的元素
使用
bean类
data class SortBean(
val id: Int, // 下标
val title: String, // 名字
val abbreviation: String, // 简称
)
SortListCallBack类 实现SortedListAdapterCallback 抽象类重写三个方法
class SortListCallBack(adapter: RecyclerView.Adapter<*>) :
SortedListAdapterCallback<SortBean>(adapter) {
/*
* TODO 用来排序 排序条件
*
* 如果指定的数与参数相等返回0。
* 如果小于其他值,则返回负数;
* 如果大于其他值,则返回正数。
*/
override fun compare(o1: SortBean, o2: SortBean): Int = let {
// 从大到小
// o2.position.compareTo(o1.position)
// 从小到大
o1.id.compareTo(o2.id)
}
/*
*
* 参数一: oldItem–对象的上一个表示形式。
参数二: newItem–替换上一个对象的新对象。
返回:如果项目内容相同,则为True;如果项目内容不同,则为false。
*
*/
override fun areContentsTheSame(oldItem: SortBean, newItem: SortBean): Boolean =
oldItem.hashCode() == newItem.hashCode()
/*
* 作者: android 超级兵
* 时间: 2021/10/9 09:53
* TODO: [用来去重]
*/
override fun areItemsTheSame(item1: SortBean, item2: SortBean): Boolean =
item1.id == item2.id
}
这里是排序的精髓,关键的解释一下这三个方法:
-
compare(o1: SortBean, o2: SortBean): Int [设置排序条件]
比如当前是根据id排序[从小到大]
也可以根据id从大到小排序!
当然也可以根据字母顺序进行排序
-
areItemsTheSame(item1: SortBean, item2: SortBean): Boolean 用来去重
直接看效果图一目了然:
-
areContentsTheSame(oldItem: SortBean, newItem: SortBean): Boolean. 如果有相同的属性就会走到这个方法
以为这么就完了吗?
再来看一种情况!
RecyclerView 的代码
其余代码都简单,大致看看应该就能懂
RecyclerView recyclerView = findViewById(R.id.recyclerView);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
SortAdapter sortAdapter = new SortAdapter();
SortListCallBack callBack = new SortListCallBack(sortAdapter);
SortedList<SortBean> sortBeans = new SortedList<>(SortBean.class, callBack);
// 随便初始化一下数据
sortBeans.add(new SortBean(2, "四川", "AS"));
sortBeans.add(new SortBean(11, "内蒙古", "N"));
sortBeans.add(new SortBean(5, "湖北", "H"));
sortBeans.add(new SortBean(2, "山西", "S"));
sortBeans.add(new SortBean(3, "陕西", "S"));
sortBeans.add(new SortBean(5, "湖南", "H"));
// sortBeans.add(new SortBean(10, "海南", "H"));
// sortBeans.add(new SortBean(12, "浙江", "Z"));
// 设置数据
sortAdapter.sortList = sortBeans;
recyclerView.setAdapter(sortAdapter);
和普通的RecyclerView不一样的地方就是设置数据的时候 之前可能用的是ArrayList 现在使用的是SortedList 其余的没有什么不一样的地方!
Adapter类
class SortAdapter : RecyclerView.Adapter<SortAdapter.SortViewHolder>() {
lateinit var sortList: SortedList<SortBean>
inner class SortViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView) {
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): SortViewHolder {
return SortViewHolder(View.inflate(parent.context, R.layout.item, null))
}
override fun onBindViewHolder(holder: SortViewHolder, position: Int) {
holder.itemView.tv.text = sortList[position].toString()
}
override fun getItemCount(): Int = sortList.size()
/*
* 作者: android 超级兵
* 时间: 2021/10/9 13:12
* TODO: 添加所有集合
*/
fun addAll(list: List<SortBean>) {
sortList.beginBatchedUpdates()
sortList.addAll(list)
sortList.endBatchedUpdates()
}
/*
* 作者: android 超级兵
* 时间: 2021/10/9 13:11
* TODO: 添加一个元素
*/
fun setData(sortBean: SortBean) {
sortList.add(sortBean)
}
/*
* 作者: android 超级兵
* 时间: 2021/10/9 13:11
* TODO: 根据下标删除某个元素
*/
fun deleteData(index: Int) {
sortList.removeItemAt(index)
}
/*
* 作者: android 超级兵
* 时间: 2021/10/9 13:11
* TODO: 删除集合中的某个对象
*/
fun deleteData(data: SortBean) {
sortList.remove(data)
}
}
注意点:
- SortedList 并不是List的子类,也不是java中提供的方法
- SortedList 是 android中独有的类
- 其内部存储是通过数组来存储
- SortedList 目前仅支持配合RecyclerView使用,还不支持ListView
最后还有一些按钮的点击事件:
初始化26个字母与随机数
Random mRandom = new Random();
ArrayList<Character> charList = new ArrayList<>();
for (int i = 0; i < 26; i++) {
charList.add((char) (65 + i));
}
点击事件:
// TODO 添加一个
viewDataBinding.btAdd.setOnClickListener(v -> {
// 随机
int charRandom = mRandom.nextInt(charList.size());
sortAdapter.setData(new SortBean(charRandom, "add-" + charRandom, String.valueOf(charList.get(charRandom))));
}
);
// TODO 添加5个
viewDataBinding.btAddAll.setOnClickListener(v -> {
ArrayList<SortBean> list = new ArrayList<>();
for (int i = 0; i < 5; i++) {
// 随机
int charRandom = mRandom.nextInt(charList.size());
list.add(new SortBean(charRandom, "all-" + charRandom, String.valueOf(charList.get(charRandom))));
}
sortAdapter.addAll(list);
});
// TODO 删除
viewDataBinding.btDelete.setOnClickListener(v -> {
// 始终删除第0个位置的数据
sortAdapter.deleteData(0);
});
原创不易,您的点赞就是对我最大的支持!
以上是关于android 实用的小技巧(RecyclerView 数据排序 -- SortedList)的主要内容,如果未能解决你的问题,请参考以下文章