Android在ListView中处理许多EditText字段
只是一个基本问题:如果我有几十个EditText字段是ListAdapter的一部分,那么各个EditText字段如何知道它们属于哪一行 目前我正在使用TextWatcher来监听文本输入。我已经尝试扩展TextWatcher,以便可以将EditText的位置传递给TextWatcher的构造函数 但是,当软键盘弹出时,与各种EditText字段相对应的位置会移动 如何跟踪EditText字段到其正确位置 我正在使用GridView来进行布局。每个项目的布局都是一个ImageView,下面有一个TextView和EditText字段 每个EditText的文本保存在名为字符串的全局字符串数组中。它最初是空的,由我的TextWatcher类更新Android在ListView中处理许多EditText字段,android,gridview,android-edittext,listadapter,textwatcher,Android,Gridview,Android Edittext,Listadapter,Textwatcher,只是一个基本问题:如果我有几十个EditText字段是ListAdapter的一部分,那么各个EditText字段如何知道它们属于哪一行 目前我正在使用TextWatcher来监听文本输入。我已经尝试扩展TextWatcher,以便可以将EditText的位置传递给TextWatcher的构造函数 但是,当软键盘弹出时,与各种EditText字段相对应的位置会移动 如何跟踪EditText字段到其正确位置 我正在使用GridView来进行布局。每个项目的布局都是一个ImageView,下面有一个
public void initList()
{
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, R.layout.shape, strings)
{
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.shape, null);
}
final String theData = getItem(position);
final EditText editText = (EditText) convertView.findViewById(R.id.shape_edittext);
editText.setText(theData);
editText.addTextChangedListener(
new MyTextWatcher(position, editText)
);
ImageView image = (ImageView) convertView.findViewById(R.id.shape_image);
image.setBackgroundResource(images[position]);
TextView text = (TextView) convertView.findViewById(R.id.shape_text);
if (gameType == SHAPES_ABSTRACT)
text.setText("Seq:");
else
text.setVisibility(View.GONE);
return convertView;
}
@Override
public String getItem(int position) { return strings[position]; }
};
grid.setAdapter(listAdapter);
}
private class MyTextWatcher implements TextWatcher {
private int index;
private EditText edittext;
public MyTextWatcher(int index, EditText edittext) {
this.index = index;
this.edittext = edittext;
}
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
public void onTextChanged(CharSequence s, int start, int before, int count) {}
public void afterTextChanged(Editable s) { strings[index] = s.toString(); }
public void setIndex(int newindex) { index = newindex; }
}
public void initList()
{
ArrayAdapter listAdapter=新的ArrayAdapter(this,R.layout.shape,strings)
{
@凌驾
公共视图getView(最终整数位置、视图转换视图、视图组父视图){
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.shape,null);
}
最终字符串数据=getItem(位置);
final EditText EditText=(EditText)convertView.findViewById(R.id.shape\u EditText);
editText.setText(数据);
editText.addTextChangedListener(
新MyTextWatcher(位置,编辑文本)
);
ImageView image=(ImageView)convertView.findViewById(R.id.shape\u image);
image.setBackgroundResource(图像[位置]);
TextView text=(TextView)convertView.findViewById(R.id.shape\u text);
如果(游戏类型==形状\u抽象)
text.setText(“Seq:”);
其他的
text.setVisibility(View.GONE);
返回视图;
}
@凌驾
公共字符串getItem(int位置){返回字符串[position];}
};
setAdapter(listAdapter);
}
私有类MyTextWatcher实现TextWatcher{
私有整数索引;
私人编辑文本;
公共MyTextWatcher(int索引,EditText){
这个指数=指数;
this.edittext=edittext;
}
public void beforeTextChanged(字符序列s、int start、int count、int after){}
public void onTextChanged(字符序列,int start,int before,int count){}
public void PostTextChanged(可编辑的s){strings[index]=s.toString();}
public void setIndex(int newindex){index=newindex;}
}
当我点击第一个编辑文本(见图)时,编辑文本移到笑脸下的编辑文本
是否需要将编辑文本存储在列表单元格中可能值得考虑?当用户一次只编辑一个时,这似乎有点不必要
虽然我不知道你的应用程序是如何设计的,但我建议你稍微重新考虑一下你的用户体验,这样当按下列表项时,就会出现一个文本编辑,供他们编辑。这样,您就可以像通常使用列表适配器一样获取列表项引用,在用户编辑时存储它,并在用户完成编辑后更新它。我不确定您的设计是否很好,因为EditText内容很有可能出现问题(内容混乱、缺少文本)滚动列表视图后。考虑一下M6TT的想法。
但是如果你真的想按自己的方式去做,你能发布一些代码吗,特别是关于你的TextWatcher的代码吗?不考虑这是否是一个好的UI设计,以下是你的做法:
public class TestList
{
public void blah()
{
ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>()
{
@Override
public View getView(int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null);
}
final DataBucket dataBucket = getItem(position);
final EditText editText = (EditText) convertView.findViewById(R.id.theText);
editText.setText(dataBucket.getSomeData());
editText.addTextChangedListener(new TextWatcher()
{
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void afterTextChanged(Editable editable)
{
dataBucket.setSomeData(editable.toString());
}
});
return convertView;
}
};
}
public static class DataBucket
{
private String someData;
public String getSomeData()
{
return someData;
}
public void setSomeData(String someData)
{
this.someData = someData;
}
}
}
公共类测试列表
{
公开无效的废话
{
ArrayAdapter listAdapter=新的ArrayAdapter()
{
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图)
{
if(convertView==null)
{
convertView=LayoutInflater.from(getContext()).flate(R.layout.testlayout,null);
}
最终数据包数据包=getItem(位置);
final EditText EditText=(EditText)convertView.findViewById(R.id.theText);
editText.setText(dataBucket.getSomeData());
editText.addTextChangedListener(新的TextWatcher()
{
更改前的公共无效(CharSequence CharSequence,int i,int i1,int i2)
{
}
public void onTextChanged(CharSequence CharSequence,int i,int i1,int i2)
{
}
public void PostTextChanged(可编辑)
{
dataBucket.setSomeData(可编辑的.toString());
}
});
返回视图;
}
};
}
公共静态类数据包
{
私有字符串数据;
公共字符串getSomeData()
{
返回一些数据;
}
public void setSomeData(字符串someData)
{
this.someData=someData;
}
}
}
“DataBucket”是一个占位符。您需要使用创建的任何类来存储在编辑文本中输入和编辑的数据。TextWatcher将引用引用的数据对象。滚动时,编辑文本框应使用当前数据进行更新,并保存文本更改。您可能希望跟踪用户更改了哪些对象,以提高数据/网络更新的效率
*编辑*
要使用int位置而不是直接引用对象,请执行以下操作:
ArrayAdapter<DataBucket> listAdapter = new ArrayAdapter<DataBucket>()
{
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null);
}
final DataBucket dataBucket = getItem(position);
final EditText editText = (EditText) convertView.findViewById(R.id.theText);
editText.setText(dataBucket.getSomeData());
editText.addTextChangedListener(new TextWatcher()
{
public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void onTextChanged(CharSequence charSequence, int i, int i1, int i2)
{
}
public void afterTextChanged(Editable editable)
{
getItem(position).setSomeData(editable.toString());
}
});
return convertView;
}
};
ArrayAd
public class TestList extends Activity
{
private String[] guess;
//Other methods in here, onCreate, etc
//Call me from somewhere else. Probably onCreate.
public void initList()
{
ArrayAdapter<String> listAdapter = new ArrayAdapter<String>(this, /*some resourse id*/, guess)
{
@Override
public View getView(final int position, View convertView, ViewGroup parent)
{
if (convertView == null)
{
convertView = LayoutInflater.from(getContext()).inflate(R.layout.testlayout, null);
}
final String theData = getItem(position);
final EditText editText = (EditText) convertView.findViewById(R.id.theText);
editText.setText(theData);
editText.addTextChangedListener(
new MyTextWatcher(position)
);
return convertView;
}
};
gridView.setAdapter(listAdapter);
}
class MyTextWatcher extends TextWatcher {
private int position;
public MyTextWatcher(int position) {
this.position = position;
}
public void afterTextChanged(Editable s) {
guess[position] = s.toString();
}
// other methods are created, but empty
}
}
class DoubleAdapter extends ArrayAdapter<Double> {
public DoubleAdapter(Context context, List<Double> list) {
super(context, android.R.layout.simple_list_item_1, list);
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
convertView = LayoutInflater.from(getContext()).inflate(R.layout.item_row, null);
}
// keep a reference to an item in a list
final Double d = getItem(position);
TextView lblId = (TextView) convertView.findViewById(R.id.lblId);
lblId.setText(d.toString());
Button button1 = (Button) convertView.findViewById(R.id.button1);
button1.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
// the button listener has a reference to an item in the list
// so it can know its position in the ListView
int i = getPosition(d);
Toast.makeText(getContext(), "" + i, Toast.LENGTH_LONG).show();
remove(d);
}
});
return convertView;
}
}
edittext.setTag(R.id.position<any unique string identitiy>, position)
int position = edittext.getTag(R.id.position)