Android 到另一个Activity的Fragment 刷新Recycle列表

 
 
 
 
1024 节日快乐  但还是在上班  发发博客摸摸鱼
 
 
 

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)

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

huang_ftpjh

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值