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

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

【Android】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(),如下:

package myapp.alex.com.myapplication;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Button;
import android.widget.Toast;

import java.util.HashMap;
import java.util.Map;

public class MainActivity extends AppCompatActivity implements CustomerAdapter.SaveEditListener{

    Map<Integer, String> map = new HashMap<>();
    String[] infos;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        RecyclerView recyclerView= (RecyclerView) findViewById(R.id.id_recyclerciew);
        //设置客户信息界面
        infos = getResources().getStringArray(R.array.customer_info);
        String[] hints = getResources().getStringArray(R.array.customer_info_hint);
        CustomerAdapter customerAdapter = new CustomerAdapter(infos, hints, this);
        recyclerView.setLayoutManager(new LinearLayoutManager(this));
        recyclerView.setAdapter(customerAdapter);
        //Button save= (Button) findViewById(R.id.id_save);
        //动态存储RecyclerView每个item上EditText的内容
        map.clear();
    }

    //监听保存
    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();
        }
    };

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

    }


}

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


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

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