Android开发中动态获取RecyclerView的Item中EditText的内容

最近在项目开发中,遇到一个问题,如下图所示

这里我是使用RecyclerView实现这种效果,其Item由一个TextView和一个EditText组成。用户填写相应数据,点击保存按钮,我要对用户输入的数据进行处理。这里我就要获取EditText的内容,首先我想到的是:使用RecyclerView提供的方法,getChildAt(position),一一获取对应的子view,然后进行处理,但令人遗憾的是:这里返回的view为null,奇怪的是recyclerView.getChildCount()能够正常返回。既然此路不通,我们只好换一个思路:通过监听EditText的事件,来返回EditText输入内容,然后调用自己定义的接口,来把数据回调出去。

基于这种思路,我们可以这样修改RecyclerView的adapter,如下所示:

package myapp.alex.com.myapplication;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.EditText;
import android.widget.TextView;



/**
 * Created by liuweiqiang on 2016/9/7.
 */
public class CustomerAdapter extends RecyclerView.Adapter<CustomerAdapter.MyViewHolder> {

    private Context mContext;
    private String[] mInfos;
    private String[] mHints;

    public interface SaveEditListener{

        void SaveEdit(int position, String string);
    }

    public CustomerAdapter(String[] infos,String[] hints,Context mContext) {
        this.mInfos=infos;
        this.mHints=hints;
        this.mContext = mContext;
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        MyViewHolder holder = new MyViewHolder(LayoutInflater.from(mContext).inflate(
                R.layout.item_customer, parent, false));
        return holder;
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder,final int position) {

        holder.c_name.setText(mInfos[position]);
        holder.c_name_et.setHint(mHints[position]);
        //添加editText的监听事件
        holder.c_name_et.addTextChangedListener(new TextSwitcher(holder));
        //通过设置tag,防止position紊乱
        holder.c_name_et.setTag(position);
    }

    @Override
    public int getItemCount() {
        return mInfos.length;
    }

    public class MyViewHolder extends RecyclerView.ViewHolder
    {

        TextView c_name;//客户名称
        EditText c_name_et;//填写项

        public MyViewHolder(View view)
        {
            super(view);
            c_name = (TextView) view.findViewById(R.id.c_name);
            c_name_et= (EditText) view.findViewById(R.id.c_name_et);
        }
    }

    //自定义EditText的监听类
    class TextSwitcher implements TextWatcher {

        private MyViewHolder mHolder;

        public TextSwitcher(MyViewHolder mHolder) {
            this.mHolder = mHolder;
        }

        @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) {
            //用户输入完毕后,处理输入数据,回调给主界面处理
            SaveEditListener listener= (SaveEditListener) mContext;
            if(s!=null){
                listener.SaveEdit(Integer.parseInt(mHolder.c_name_et.getTag().toString()),s.toString());
            }

        }
    }

}


adapter这里已经获取EditText内容,在主界面处理的话,我们就要继承接口SaveEditListener,实现SaveEdit(),如下:

   @Override
    public void SaveEdit(int position, String string) {
        //回调处理edittext内容,使用map的好处在于:position确定的情况下,string改变,只会动态改变string内容
        map.put(position,string);

    }

这样的话,我们就可以动态的存储用户的输入内容,然后对map进行处理

  //监听保存
    void OnSave(View view){
        //处理存储edittext的map
        //如判断客户名称是否填写且不为空格
        if(map.get(0)!=null&&!map.get(0).trim().equals("")){
            //遍历处理map存储的内容
            for (int i=0;i<infos.length;i++){
                //do something

            }

        }else{
            Toast.makeText(this,"客户名称必填且不可为空",Toast.LENGTH_SHORT).show();
        }
    };


通过以上设计,我们就可以实现动态的获取RecyclerView的Item中EditText的内容,并对其进行处理。

这里有一个简单的demo,来展示上述效果。demo下载地址:DEMO下载地址

  • 10
    点赞
  • 29
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
你可以在RecyclerView的Adapter为每个EditText设置FocusChange监听器,然后在监听处理焦点变化的逻辑。例如,当EditText失去焦点时,可以调用其clearFocus()方法来让其失去焦点。同时,你需要在RecyclerViewItem布局添加一个可获取焦点的控件,例如一个Button,当用户点击这个Button时,你可以调用RecyclerView的requestFocus()方法来让RecyclerView获取焦点,这样所有的EditText就会失去焦点了。 以下是一个简单的示例代码: ```java public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private List<String> mData; public MyAdapter(List<String> data) { mData = data; } @NonNull @Override public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) { View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false); return new ViewHolder(view); } @Override public void onBindViewHolder(@NonNull ViewHolder holder, int position) { holder.mEditText.setText(mData.get(position)); holder.mEditText.setOnFocusChangeListener(new View.OnFocusChangeListener() { @Override public void onFocusChange(View v, boolean hasFocus) { if (!hasFocus) { holder.mEditText.clearFocus(); } } }); holder.mButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { holder.itemView.requestFocus(); } }); } @Override public int getItemCount() { return mData.size(); } public static class ViewHolder extends RecyclerView.ViewHolder { public EditText mEditText; public Button mButton; public ViewHolder(@NonNull View itemView) { super(itemView); mEditText = itemView.findViewById(R.id.edit_text); mButton = itemView.findViewById(R.id.button); } } } ``` 在上述代码,我们为每个EditText设置了FocusChange监听器,并在监听处理了焦点变化的逻辑。同时,在Item布局添加了一个Button,并为其设置了点击事件,当用户点击这个Button时,我们调用RecyclerView的requestFocus()方法来让RecyclerView获取焦点,从而让所有的EditText失去焦点。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值