Android新手 一直空指针
我会些许网页的刷新 , 无论是js的全局刷新window.location.reload() 还是ajax和定时器控制的局部刷新, 但实现时间都没有Android这个刷新多
点击FragmentGroup 的 recycleView列表的一个分组,在分组详情页面修改分组名
编辑分组名后,我们要先刷新一下当前页面视图的值(比如说分组名)
弹窗类里面 编辑分组,点击确定后
TextView textView = view.findViewById(R.id.tvGroupName);
textView.setText(text);
然后到另一个Activity的Fragment 刷新Recycle列表,出问题了。死活不刷新
解决方法 通过EventBus发送订阅 列表内容修改时会自动执行并修改
操作
导入EventBus依赖到gradle
//EventBus
implementation 'org.greenrobot:eventbus:3.1.1'
建一个 空类里面没有其它东西
class GroupEditEvent(var oldGroupId:String, var groupId: String)
FragmentGroup 这个Fragment 是另一个Activity的Fragment 刷新这个片段列表
import org.greenrobot.eventbus.Subscribe
import org.greenrobot.eventbus.ThreadMode
/**
* 注册Event Bus监听
*/
protected fun registerEventBus() {
// 注册订阅者
EventBus.getDefault().register(this)
}
/**
* 注销Event Bus监听
*/
protected fun unregisterEventBus() {
// 注销订阅者
EventBus.getDefault().unregister(this)//3
}
一般在Fragment里面
//首先需要注册监听
override fun onViewCreated(view: View, savedInstanceState: Bundle?) {
registerEventBus()
}
override fun onDestroyView() {
super.onDestroyView()
unregisterEventBus()
}
onViewCreated()方法 与 下面方法都在 FragmentGroup 里面
//ThreadMode.BACKGROUND 后台运行 不占用主线程时间 造成页面卡顿 ThreadMode.MAIN
@Subscribe(threadMode = ThreadMode.BACKGROUND)
fun onGroupEditEvent(event: GroupEditEvent) {
if (!isAttached()) {
return
}
//Lg.i("onGroupEditEvent, group id=${event.groupId}") 查看有没有进入方法
val group = DbGroupManager.getInstance().getGroupById(event.groupId) //查找已经更改分组名的 LabelGroup
val groups = groupMainAdapter.groups//groups 是这个列表的所有元素List<LabelGroup>
for (i in 0 until groups.size) {
var tempGroup = groups[i]
if (tempGroup.groupId.equals(event.oldGroupId)) { //与旧分组名前的对比,匹配到到那一条更改它
//Lg.i("notify changed ,id = ${group?.groupId}")
group?.let { groupMainAdapter.groups.set(i, it) } //.let {} 表达式 他的返回值就是group(LabelGroup)
AppExecutorsProxy.executors.mainThread().execute {
groupMainAdapter.notifyItemChanged(i) //主线程刷新列表
}
return
}
}
}
相关知识
let {} 表达式作用: 定义一个变量在一个特定的作用于范围内 避免写一些判断null的操作
https://blog.csdn.net/carson_ho/article/details/104471757?utm_medium=distribute.pc_relevant.none-task-blog-title-7&spm=1001.2101.3001.4242// 使用Java if( mVar != null ){ mVar.function1(); mVar.function2(); mVar.function3(); } // 使用kotlin(无使用let函数) mVar?.function1() mVar?.function2() mVar?.function3() // 使用kotlin(使用let函数) // 方便了统一判空的处理 & 确定了mVar变量的作用域 mVar?.let { it.function1() it.function2() it.function3() }
相关参数 groups
groupMainAdapter.groups groupMainAdapter该适配器里面定义的参数,即列表显示的数据
public final List<LabelGroup> groups = new ArrayList<>();
相关方法
fun isAttached():Boolean{ return view != null && !isRemoving }
这是分组详情页面修改分组名的弹窗 即发送订阅到 FragmentGroup 这个列表所在Fragment(activity),执行 onGroupEditEvent()
发送分组信息编辑事件 TODO 到另一个Activity的Fragment 刷新Recycle列表
EventBus.getDefault().post(new GroupEditEvent(OldGroupName,text));
//EventBus
implementation 'org.greenrobot:eventbus:3.1.1'
import org.greenrobot.eventbus.EventBus;
编辑分组的弹窗
//编辑分组
public void editGroupDialog(Context context,String OldGroupName,View view) {//GroupMainAdapter groupMainAdapter
AlertDialog.Builder customizeDialog =
new AlertDialog.Builder(context);
final View dialogView = LayoutInflater.from(context)
.inflate(R.layout.dialog_group_create_group,null);
// 为编辑分组的文本框赋值
FragmentGroupInfoHolder fragmentGroupInfoHolder = new FragmentGroupInfoHolder();
fragmentGroupInfoHolder.tvGroupName = dialogView.findViewById(R.id.dialog_et_input_create_group);
fragmentGroupInfoHolder.tvGroupName.setText(OldGroupName);
dialogView.setTag(fragmentGroupInfoHolder);
customizeDialog.setTitle("编辑分组");
customizeDialog.setView(dialogView);
customizeDialog.setPositiveButton("确定", new DialogInterface.OnClickListener() {//添加"Yes"按钮
@Override
public void onClick(DialogInterface dialogInterface, int i) {
//调用数据库修改分组名
EditText edit_text = (EditText) dialogView.findViewById(R.id.dialog_et_input_create_group);
String text = edit_text.getText().toString().trim();
DbGroupManager.Companion.getInstance().updateGroupName(text,OldGroupName,context);
// 刷新分组主页和分组详情页
TextView textView = view.findViewById(R.id.tvGroupName);
textView.setText(text);
//TODO 发送分组信息编辑事件
EventBus.getDefault().post(new GroupEditEvent(OldGroupName,text));
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {//添加取消
@Override
public void onClick(DialogInterface dialogInterface, int i) {
}
});
customizeDialog.show();
}
DbGroupManager 应用采用Room
这样操作就不用写 LabelInfoDatabase.getInstance(context).labelGroupDao()
CurApp.getAppContext() 用
private val dao: LabelGroupDao
companion object {
@Volatile
var manager: DbGroupManager? = null
fun getInstance(): DbGroupManager {
if (manager == null) {
synchronized(DbGroupManager::class.java) {
if (manager == null) {
manager = DbGroupManager(CurApp.getAppContext())
}
}
}
return manager!!
}
}
private constructor(context: Context) {
dao = LabelInfoDatabase.getInstance(context).labelGroupDao()
}
注意: 可以建多几个类似 onGroupEditEvent的方法在Fragment 但方法名必须不同(即使参数不同)
@Subscribe(threadMode = ThreadMode.BACKGROUND)
fun onGroupNumEditEvent(event: GroupLabelNumEvent) {
Lg.i("onGroupNumEditEvent")
if (!isAttached()) {
Lg.i("onGroupNumEditEvent isAttached !isAttached()")
return
}
val groups = groupMainAdapter.groups
for (i in 0 until groups!!.size) {
var tempGroup = groups[i]
if (tempGroup.groupId.equals(event.GroupId)) {
//Lg.i("notify changed ,id = ${group?.groupId}")
var tempGroupNum = tempGroup.groupNumber!!.toInt()
if (event.flag){
tempGroupNum = tempGroupNum + event.groupNumber
}else{
tempGroupNum = tempGroupNum - event.groupNumber
}
tempGroup.groupNumber = tempGroupNum.toString()
groupMainAdapter.groups.set(i,tempGroup)
AppExecutorsProxy.executors.mainThread().execute {
groupMainAdapter.notifyItemChanged(i)
}
return
}
}
}
EventBus.getDefault().post(GroupLabelNumEvent(GroupName!!,groupNumber,false))
class GroupLabelNumEvent(var GroupId:String,var groupNumber:Int,var flag:Boolean)