IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 移动开发 -> android recyclerView上item的EditextView焦点乱跑和数据混乱 -> 正文阅读

[移动开发]android recyclerView上item的EditextView焦点乱跑和数据混乱

       **一:这部分代码是解决数据混乱的问题**

public StandGradeScoreListAdapter(Context context) {
this.context = context;
inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
}

   inputMethodManager = (InputMethodManager) context.getSystemService(Context.INPUT_METHOD_SERVICE);
       //通过设置tag,防止position紊乱
       holder.editReduceMark.setTag(position);
       holder.editReduceMark.clearFocus();
        //1、为了避免TextWatcher在第2步被调用,提前将他移除。
        if (holder.editReduceMark.getTag() != null && holder.editReduceMark.getTag() instanceof TextWatcher) {
            holder.editReduceMark.removeTextChangedListener((TextWatcher) holder.editReduceMark.getTag());
            holder.editReduceMark.clearFocus();
            inputMethodManager.hideSoftInputFromWindow(holder.editReduceMark.getWindowToken(), 0);
        }
        // 第2步:移除TextWatcher之后,设置EditText的Text。
          holder.editReduceMark.setTextColor(context.getResources().getColor(R.color.color_ff333333));
          if (standardList.get(position).getExaminerRemark()!=null){
              holder.editReduceMark.setText(standardList.get(position).getExaminerRemark());
          }else {
              holder.editReduceMark.setText("");
          }

           TextWatcher watcher = new TextWatcher() {
            @Override
            public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            }
            @Override
            public void afterTextChanged(Editable editable) {
                if (holder.editReduceMark.hasFocus()) {//判断当前EditText是否有焦点在
                    if (mTextListener!=null){
                        //通过接口回调将数据传递到Activity中
                        mTextListener.onTextChanged((Integer) holder.editReduceMark.getTag(), editable.toString());//holder.editReduceMark.getText().toString()
                    }
                }
            }
        };

        //设置EditText的焦点监听器判断焦点变化,当有焦点时addTextChangedListener,失去焦点时removeTextChangedListener
        holder.editReduceMark.setOnFocusChangeListener(new View.OnFocusChangeListener() {
            @Override
            public void onFocusChange(View v, boolean hasFocus) {
                if (hasFocus) {
                    holder.editReduceMark.addTextChangedListener(watcher);
                    new Handler().postDelayed(() ->  holder.editReduceMark.setSelection(holder.editReduceMark.getText().toString().length()), 30);
                } else {
                    holder.editReduceMark.removeTextChangedListener(watcher);
                    holder.editReduceMark.clearFocus();
                    inputMethodManager.hideSoftInputFromWindow(holder.editReduceMark.getWindowToken(), 0);
                }
            }
        });
       holder.editReduceMark.clearFocus();

二:新建recyclerView的适配管理器FoucsLinearLayoutManager
public class FoucsLinearLayoutManager extends LinearLayoutManager {

public FoucsLinearLayoutManager(Context context) {
    super(context);
}

public FoucsLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
    super(context, orientation, reverseLayout);
}

public FoucsLinearLayoutManager(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
    super(context, attrs, defStyleAttr, defStyleRes);
}


/**
 *   public boolean requestChildRectangleOnScreen (View child, Rect rectangle, boolean immediate)
 * <p>
 *   当组里的某个子视图需要被定位在屏幕的某个矩形范围时,调用此方法。重载此方法的ViewGroup可确认以下几点:
 * <p>
 *   * 子项目将是组里的直系子项
 *   * 矩形将在子项目的坐标体系中
 *   重载此方法的ViewGroup应该支持以下几点:
 *   * 若矩形已经是可见的,则没有东西会改变
 *   * 为使矩形区域全部可见,视图将可以被滚动显示
 *   参数
 *   child        发出请求的子视图
 *   rectangle    子项目坐标系内的矩形,即此子项目希望在屏幕上的定位
 *   immediate   设为true,则禁止动画和平滑移动滚动条
 * <p>
 *   返回值
 *   进行了滚动操作的这个组(group),是否处理此操作。
 *
 * @param parent
 * @param child
 * @param rect
 * @param immediate
 * @return
 */
@Override
public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate) {

   //这里的child 是整个HeadView 而不是某个具体的editText
    LogUtil.e("requestChildRectangleOnScreen()====> chlild==" + child.getId(), "parent==" + parent.getId());
    return false;
}

@Override
public boolean requestChildRectangleOnScreen(RecyclerView parent, View child, Rect rect, boolean immediate, boolean focusedChildVisible) {

    //这里的child 是整个HeadView 而不是某个具体的editText
    LogUtil.e("requestChildRectangleOnScreen( focusedChildVisible=)====> chlild==" + child.getId() , "parent==" + parent.getId());
    return false;
}

}

三:直接调用
1) recyclerView.setLayoutManager(new FoucsLinearLayoutManager(getContext()));//说明下不要用系统的LinearLayoutManager
2)获取数据的回调方法:
scoreListAdapter.setOnTextChangeListener(new StandGradeScoreListAdapter.onTextChangeListener() {
//带扣分备注
private Map<Integer, StandardListsBean.DataBean.ContentListBean.FactorListBean.StandardListBean> map=new HashMap<>();
@Override
public void onTextChanged(int postion, String content) {
factorList.get(position).getStandardList().get(postion).setExaminerRemark(content);
map = new HashMap<>();
StandardListsBean.DataBean.ContentListBean.FactorListBean.StandardListBean listBean1=new StandardListsBean.DataBean.ContentListBean.FactorListBean.StandardListBean();
listBean1.scoreTableStandardId=factorList.get(position).getStandardList().get(postion).getScoreTableStandardId();
listBean1.remark=factorList.get(position).getStandardList().get(postion).getExaminerRemark();
LogUtil.i(“listBean1Remark”,"==="+factorList.get(position).getStandardList().get(postion).getExaminerRemark());
map.put(factorList.get(position).getStandardList().get(postion).getScoreTableStandardId(), listBean1);

            for (Integer key : map.keySet()) {
                StandardListsBean.DataBean.ContentListBean.FactorListBean.StandardListBean standardListBean = map.get(key);
                boolean door = true;
                for (int i = 0; i <selectDatasList.size();i++) {
                    if (selectDatasList.get(i).scoreTableStandardId==standardListBean.scoreTableStandardId){
                        door = false;
                        selectDatasList.get(i).remark = standardListBean.remark;
                    }
                }
               if(door)
                    selectDatasList.add(standardListBean);
               }
              Double aDouble = StandGradeScoreListAdapter.dealScore(selectDatasList, dataBeanList,totalScore);
              tablePlusOrMinus(selectDatasList, aDouble);
              EventBus.getDefault().post(new TableScoreMessageEvent(aDouble,selectDatasList));
         }
    });

此部分代码亲测有效,解决了recyclerView嵌套recyclerView,并且子recyclerView上item嵌套多个EdittextView,由于recyclerView的复用问题,导致的数据混乱和焦点胡乱跑,总是跑到页面顶部或者其他item上,体验极度不好,所以再次做个记录

  移动开发 最新文章
Vue3装载axios和element-ui
android adb cmd
【xcode】Xcode常用快捷键与技巧
Android开发中的线程池使用
Java 和 Android 的 Base64
Android 测试文字编码格式
微信小程序支付
安卓权限记录
知乎之自动养号
【Android Jetpack】DataStore
上一篇文章      下一篇文章      查看所有文章
加:2022-04-22 18:47:45  更:2022-04-22 18:52:05 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/24 22:46:15-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码