Android开发通过Tag获取View,Android开发中动态获取RecyclerView的Item中EditText的内容

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

0818b9ca8b590ca3270a3433284dd417.png

这里我是使用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 {

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

//do something

}

}else{

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

}

};

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

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

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值