我有一个ListView每行有EditText控件的地方.我想在TextChangedListener每一行添加一个; 一个包含额外数据的数据,它说明了哪一行EditText.问题是,当getView被调用时,TextWatchers会添加多个; 因为convertView已经有一个TextWatcher(和一个指向不同的行).
MyTextWatcher watcher = new MyTextWatcher(currentQuestion);
EditText text = (EditText)convertView.findViewById(R.id.responseText);
text.addTextChangedListener(watcher);
Run Code Online (Sandbox Code Playgroud)
MyTextWatcher是我的班级实施TextWatcher; 并处理文本事件.CurrentQuestion让我知道我正在采取哪一行.当我输入框中; TextWatcher调用多个实例.
有没有办法TextWatchers在添加新的之前删除它?我看到了removeTextChangedListener方法,但这需要TextWatcher传入一个特定的,我不知道如何获得指针TextWatcher已经存在的指针.
我对TextWatcher有一个恼人的问题.我一直在网上搜索,但找不到任何东西.感谢有人能帮助我.
出于某种原因,在一次文本更改时对TextWatcher事件的调用是不稳定的.有时它们会被触发一次(就像它们应该的那样),有时是两次,有时是3次.不知道为什么,整件事情非常直截了当.有时候,afterTextChanged()上的Editable参数会返回toString()和length()中的空值.
代码如下:
private TextWatcher mSearchAddressTextChangeListener = new TextWatcher() {
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) { }
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) { }
@Override
public void afterTextChanged(Editable searchedAddress) {
System.out.println("called multiple times.");
}
};
Run Code Online (Sandbox Code Playgroud)
内部afterTextChanged()(和AsyncTask)我没有对文本或EditText视图进行任何更改.
我看到在TextWatcher的事件中询问的问题被调用了两次,但我发现事件触发的次数多于(或少于)两次.
无论如何,感谢任何帮助.
编辑:我删除了afterTextChanged()的内容导致即使没有我的代码也会发生此问题.是什么让我相信这是一个错误.当在常规字符(事件处理程序被触发两次)之后输入'space'字符时或者在删除常规字符之后的'space'字符(退格.事件处理程序被触发3次)时,会发生错误.帮助仍将受到赞赏.
我实际上正在开发一个Android应用程序,我应该根据JSON文档中包含的元数据显示动态表单.基本上它的工作方式(没有细节)是JSON文档代表一个表单的结构:
{
"fields": [
{
"name": "fieldA",
"type": "STRING",
"minCharacters": 10,
"maxCharacters": 100
},
{
"name": "fieldB",
"type": "INTEGER",
"min": 10,
"max": 100
},
{
"name": "fieldC",
"type": "BOOLEAN_CHECKBOX",
"defaultValue": true
}
...
],
"name": "Form A"
}
Run Code Online (Sandbox Code Playgroud)
当应用程序收到其中一个JSON文档时,我实际上正在做的是它遍历每个字段并将其解析到适当的视图(EditText,Checkbox,自定义视图等),向视图添加标记(将是能够轻松检索它并将视图添加到LinearLayout.这是一个伪代码,它实际上是如何工作的:
//Add form title
linearLayout.addView(new TextView(form.name));
//Add form fields
for(Field field: form.fields) {
View view;
switch(field.type){
case STRING: view = new EditText();
...
}
view.setTag(field.id);
linearLayout.addView(view);
}
Run Code Online (Sandbox Code Playgroud)
这个问题是,对于大型表单(如> 20个字段),它需要充斥大量视图,并且UI线程会受到很大影响.另一点需要考虑的是,单个屏幕可能有多种形式(一个接一个地垂直排序).
为了避免重载UI线程我想到了2个可能的解决方案:
但在考虑这两个解决方案时,我会遇到多个问题:
我有一个RecyclerView,其中每行也有一个EditText,允许用户输入一个值。
但是,当用户旋转屏幕时,这些值会重置为其默认的空白值。
所以我想保存的值List或者Map这样我就可以补充上恢复列表。
但是我不知道如何“迭代当前列表”并获取EditTexts并提取值。
我有一个应用程序,我用RecycleView用CardViews.该CardView含有EditText当我添加一个新的,现在CardView到RecycleView了EditText应该有重点,键盘应该会出现.
我怎样才能做到这一点?我试图在以下内容中添加一些代码onBindViewHolder:
public void onBindViewHolder(TodoViewHolder holder, final int position) {
...
if(holder.tvDescription.requestFocus()) {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
...
}
Run Code Online (Sandbox Code Playgroud)
或者虽然创造ViewHolder但它没有奏效.
public class TodoViewHolder extends RecyclerView.ViewHolder {
protected CheckBox cbDone;
protected EditText tvDescription;
protected FloatingActionButton btnDelete;
public TodoViewHolder(View itemView) {
super(itemView);
cbDone = (CheckBox)itemView.findViewById(R.id.cbDone);
tvDescription = (EditText) itemView.findViewById(R.id.tvDescription);
btnDelete = (FloatingActionButton) itemView.findViewById(R.id.btnDelete);
if(tvDescription.requestFocus()) {
window.setSoftInputMode(WindowManager.LayoutParams.SOFT_INPUT_STATE_ALWAYS_VISIBLE);
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是我AdapterCode的解决方案:
public abstract class ArrayAdapter<T, …Run Code Online (Sandbox Code Playgroud) 我有一张RecyclerView有很多牌可容纳4张的牌EditText.当我在一张EditText卡中的一张卡中输入值时,它会在随机卡中填充相同的值.令人惊讶的是它没有跳过EditText例如:
如果我输入值edittext1的card1它将填补相同的值到edittext1的card8,如果我改变的值card8会更改值回card1.有人可以告诉我为什么会这样.
先感谢您
这是我的代码:
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> {
private String[] mDataset;
public String[][] data = new String[30][4];
public static class ViewHolder extends RecyclerView.ViewHolder {
// each data item is just a string in this case
public LinearLayout mCardView;
public ViewHolder(LinearLayout v) {
super(v);
mCardView = v;
}
}
// Provide a suitable constructor (depends on the kind of …Run Code Online (Sandbox Code Playgroud)