最近在项目开发中,遇到一个问题,如下图所示
这里我是使用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下载地址