android 解决ListView Adapter嵌入EditText 数据重复刷新问题

背景

最近在开发答题类App,其中涉及到有多个填空题的这种可能。对于这种需求我就采用传统的ListVIew+Adapter的这种新式。(Ps:答题里面混合了单选、多选、填空、判断常见题型,其实就是为了方便)。主要是讲Adapter嵌入EditText所遇到的坑,给大家上一张效果图。

这是多个填空题出现的界面,其中遇到的问题就是多个输入框输入内容的时候,经过调试可知,键盘关闭的时候会再一次执行getView,这样对我们保存数据就又多执行了一次,显然是不符合我们的逻辑。先将代码粘贴如下,细节自行调整

Adapter类

    class OptionsListAdapter extends BaseAdapter {
       private  boolean flag=true;
        private Context mContext;
       private HashMap<Integer, String> contentMap = new HashMap<Integer, String>();// 保存edittext的数据,避免软键盘弹出和隐藏对数据的影响
        ListView lv;
        int index;
        public List<QuestionOptionBean> options;
        private int selectItem = -1;
        private TextView ctv;

        public OptionsListAdapter(Context context, List<QuestionOptionBean> options,
                                  ListView lv, int index) {
            this.mContext = context;
            this.options = options;
            this.lv = lv;

        }

        public int getCount() {
            return options.size();
        }

        @Override
        public boolean areAllItemsEnabled() {
            return false;
        }

        @Override
        public boolean isEnabled(int position) {

            return true;
        }

        @Override
        public boolean hasStableIds() {
            return true;
        }

        public Object getItem(int position) {
            return position;
        }

        public long getItemId(int position) {
            return position;
        }

        public View getView(final int position, View convertView, ViewGroup parent) {
            View view = null;
            final ViewHolder viewHolder;
            if (questionBean.getQuestion_type() == 4) {//多选填空题
                if (view == null) {
                    view = LayoutInflater.from(mContext).inflate(
                            R.layout.item_edittext, null);

                    viewHolder = new ViewHolder(view);
                    view.setTag(viewHolder);
                } else {

                    viewHolder = (ViewHolder) view.getTag();
                }
                if (viewHolder.editText.getTag() instanceof TextWatcher) {
                    viewHolder.editText.removeTextChangedListener((TextWatcher)
                            viewHolder.editText.getTag());
                }
                if(flag)
                {
                if (!options.get(position).getName().isEmpty()) {//上一次提交的答案,现在要显示出来。
                    viewHolder.editText.setText(options.get(position).getDescription());
                    contentMap.put(position, viewHolder.editText.getText().toString());// 把改变后的数据存储起来
                }
                }
                //确定EdtitText编辑位置
                viewHolder.editText.setOnTouchListener(new View.OnTouchListener() {//确定EditText触摸位置
                    @Override
                    public boolean onTouch(View v, MotionEvent event) {
                        if(event.getAction()==MotionEvent.ACTION_UP)
                        {
                            index = position;
                            flag=false;//如果确定光标位置后,则代表数据已发生变化,设置为false。
                        }

                        return false;
                    }
                });
                viewHolder.editText.addTextChangedListener(new TextWatcher() {
                    @Override
                    public void beforeTextChanged(CharSequence s, int start, int count, int after) {

                    }

                    @Override
                    public void onTextChanged(CharSequence s, int start, int before, int count) {

                    }

                    @Override
                    public void afterTextChanged(Editable s) {
                        int tag = (int) viewHolder.editText.getTag();//确定EditText编辑位置
                        contentMap.put(tag, s.toString());// 把改变后的数据存储起来

                    }
                });

//                if (contentMap.get(position) != null) {
//                    viewHolder.editText.setText(contentMap.get(position));
//                } else {
//                    viewHolder.editText.setText("");
//                }
//                // 设置焦点和edittext设置光标位置,记住啊.一定要先设置text.然后再设置焦点和光标位置
//                if (index != -1 && index == position) {
//                    viewHolder.editText.requestFocus();
//                    viewHolder.editText.setSelection(viewHolder.editText.getText().toString().length());
//                }


            } else { //选择题
                view = LayoutInflater.from(mContext).inflate(
                        R.layout.list_item_option, null);
                ctv = (TextView) view.findViewById(R.id.ctv_name);
                TextView option = (TextView) view.findViewById(R.id.tv_option);
                ctv.setText(options.get(position).getName());
                option.setText(options.get(position).getDescription());
                updateBackground(position, ctv);
            }

//    if (position == selectItem) {
//       ctv.setBackgroundResource(R.drawable.option_btn_single_checked);
//       notifyDataSetChanged();
//    }
//    else {
//       ctv.setBackgroundResource(R.drawable.option_btn_single_normal);
//       notifyDataSetChanged();
//    }
            return view;


        }


        public void updateBackground(int position, TextView view) {
            int backgroundId;
            selectItem = -1;
            if (lv.isItemChecked(position)) {
                backgroundId = R.drawable.shape_red_point;
                view.setTextColor(getResources().getColor(R.color.white));
            } else {
                backgroundId = R.drawable.shape_red_unpoint;
                view.setTextColor(getResources().getColor(R.color.back));
            }
            Drawable background = mContext.getResources().getDrawable(backgroundId);
            view.setBackgroundDrawable(background);
            notifyDataSetChanged();
        }

        public void setSelectItem(int selectItem) {
            this.selectItem = selectItem;


        }
    }

end

不用想网上说的那样设置ListView宽度,毕竟这样做体验不是很好,我也没有尝试这种方法,我通过改变状态不然它再去执行getView()刷新。工作上遇到的问题,以供参考,谢谢。

猜你喜欢

转载自blog.csdn.net/qq_34993234/article/details/94721580