Android 如何在自定义游标适配器中保留edittext值
在将几乎所有来自堆栈溢出的答案应用于同一主题后,我无法找到问题的解决方案。 我的问题是我有一个列表视图,其中每行包含一个问题和一个编辑文本。但当我在编辑文本中滚动列表视图数据时,它可能会在其他编辑文本中更改或发生。 i、 e如果我在滚动之后在第1行编辑文本中写一些东西,它可能会出现在第2行或第3行编辑文本中 我甚至在cursoradapter类中尝试过一些东西,但仍然是 请帮帮我,伙计们Android 如何在自定义游标适配器中保留edittext值,android,listview,android-cursoradapter,android-viewholder,Android,Listview,Android Cursoradapter,Android Viewholder,在将几乎所有来自堆栈溢出的答案应用于同一主题后,我无法找到问题的解决方案。 我的问题是我有一个列表视图,其中每行包含一个问题和一个编辑文本。但当我在编辑文本中滚动列表视图数据时,它可能会在其他编辑文本中更改或发生。 i、 e如果我在滚动之后在第1行编辑文本中写一些东西,它可能会出现在第2行或第3行编辑文本中 我甚至在cursoradapter类中尝试过一些东西,但仍然是 请帮帮我,伙计们 import android.content.Context; import android.content
import android.content.Context;
import android.content.res.Resources;
import android.database.Cursor;
import android.text.Editable;
import android.text.TextWatcher;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.CursorAdapter;
import android.widget.EditText;
import android.widget.TextView;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Map;
import java.util.Random;
public class TestViewAdapter extends CursorAdapter
{
protected Cursor cursor;
protected Context context;
protected Resources res;
protected Random random;
protected LayoutInflater inflater;
protected Map<Integer, String>myinputs;
protected int mRowIDColumn;
public TestViewAdapter(Context context, Cursor c)
{
super(context, c);
this.cursor = c;
this.context = context;
this.res = this.context.getResources();
this.random = new Random();
boolean cursorPresent = c != null;
mRowIDColumn = cursorPresent ? this.cursor.getColumnIndexOrThrow("_id") : -1;
this.inflater = (LayoutInflater) this.context.getSystemService(this.context.LAYOUT_INFLATER_SERVICE);
myinputs = new HashMap<>();
}
private static class Viewholder
{
TextView question;
TextView answer;
EditText useranswer;
String que = "" , randomStr ="";
}
@Override
public View newView(Context context, Cursor c, ViewGroup parent)
{
View rowlayout = this.inflater.inflate(R.layout.testlist_row, null);
final Viewholder viewHolder;
String [] meaningArray = new String[] {"synonyms", "antonyms"};
viewHolder = new Viewholder();
// Set view for each row
viewHolder.question = (TextView) rowlayout.findViewById(R.id.tv_test_question);
viewHolder.answer = (TextView) rowlayout.findViewById(R.id.tv_test_answer);
viewHolder.useranswer = (EditText) rowlayout.findViewById(R.id.et_test_useranswer);
viewHolder.que = this.res.getString(R.string.popup_question); //get value from string.xml
//viewHolder.randomStr = meaningArray[this.random.nextInt(meaningArray.length)];
viewHolder.useranswer.clearFocus();
rowlayout.setTag(viewHolder);
return rowlayout;
}
@Override
public int getCount() {
return cursor.getCount();
}
@Override
public long getItemId(int position) {
if (cursor != null) {
if (cursor.moveToPosition(position)) {
return cursor.getLong(mRowIDColumn);
} else {
return 0;
}
} else {
return 0;
}
}
@Override
public void bindView(View view, Context context, Cursor c)
{
final Viewholder viewHolder = (Viewholder) view.getTag();
final int rowPosition = (int) getItemId(c.getPosition());
String synonyms = "" , antonyms = "" , word = "",text = "" ,ans = "";
word = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1)));
synonyms = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)));
antonyms = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(3)));
if ( !synonyms.isEmpty())
{
text = String.format(viewHolder.que, "synonyms", word.toLowerCase());
ans = synonyms;
}
else if( !antonyms.isEmpty())
{
text = String.format(viewHolder.que, "antonyms", word.toLowerCase());
ans = antonyms;
}
viewHolder.question.setText(text);
viewHolder.answer.setText(ans);
viewHolder.useranswer.addTextChangedListener(new TextWatcher() {
@Override
public void afterTextChanged(Editable s) {}
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count)
{
if (s.toString().length() > 0) {
Log.d("TestViewAdapterb", "pos -" + rowPosition + "," + s.toString());
myinputs.put(rowPosition , s.toString());
}
}
});
String v = myinputs.get(rowPosition);
viewHolder.useranswer.setText(v == "" ? "" : v);
}
}
导入android.content.Context;
导入android.content.res.Resources;
导入android.database.Cursor;
导入android.text.Editable;
导入android.text.TextWatcher;
导入android.util.Log;
导入android.view.LayoutInflater;
导入android.view.view;
导入android.view.ViewGroup;
导入android.widget.CursorAdapter;
导入android.widget.EditText;
导入android.widget.TextView;
导入java.util.ArrayList;
导入java.util.HashMap;
导入java.util.Map;
导入java.util.Random;
公共类TestViewAdapter扩展了CursorAdapter
{
保护光标;
受保护的语境;
受保护资源;
保护随机;
充气机;
受保护的Mapmyinputs;
受保护的int-mRowIDColumn;
公共TestViewAdapter(上下文,游标c)
{
超级(上下文,c);
this.cursor=c;
this.context=上下文;
this.res=this.context.getResources();
this.random=新的random();
布尔cursorPresent=c!=null;
mRowIDColumn=cursorPresent?this.cursor.getColumnIndexOrThrow(“\u id”):-1;
this.inflater=(LayoutInflater)this.context.getSystemService(this.context.LAYOUT\u充气器\u服务);
myinputs=新HashMap();
}
私有静态类视图持有者
{
文本视图问题;
文本视图答案;
编辑文本用户应答;
字符串que=“”,randomStr=“”;
}
@凌驾
公共视图newView(上下文上下文、光标c、视图组父对象)
{
View rowlayout=this.inflater.inflate(R.layout.testlist_行,null);
最终持票人;
String[]meaningArray=新字符串[]{“同义词”、“反义词”};
viewHolder=新的viewHolder();
//为每行设置视图
viewHolder.question=(TextView)rowlayout.findViewById(R.id.tv\u test\u question);
viewHolder.answer=(TextView)rowlayout.findViewById(R.id.tv\u test\u answer);
viewHolder.useranswer=(EditText)rowlayout.findViewById(R.id.et\u test\u useranswer);
viewHolder.que=this.res.getString(R.string.popup_question);//从string.xml获取值
//viewHolder.randomStr=meaningArray[this.random.nextInt(meaningArray.length)];
viewHolder.useranswer.clearFocus();
rowlayout.setTag(viewHolder);
返回行布局;
}
@凌驾
public int getCount(){
返回cursor.getCount();
}
@凌驾
公共长getItemId(int位置){
如果(光标!=null){
if(光标移动位置(位置)){
返回cursor.getLong(mRowIDColumn);
}否则{
返回0;
}
}否则{
返回0;
}
}
@凌驾
public void bindView(视图、上下文、光标c)
{
final Viewholder Viewholder=(Viewholder)view.getTag();
final int rowPosition=(int)getItemId(c.getPosition());
字符串同义词=”、反义词=”、单词=”、文本=”、ans=”;
word=cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1));
同义词=cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2));
反义词=cursor.getString(cursor.getColumnIndex(cursor.getColumnName(3));
if(!synonyms.isEmpty())
{
text=String.format(viewHolder.que,“同义词”,word.toLowerCase());
ans=同义词;
}
else如果(!antonyms.isEmpty())
{
text=String.format(viewHolder.que,“antonyms”,word.toLowerCase());
ans=反义词;
}
viewHolder.question.setText(文本);
viewHolder.answer.setText(ans);
viewHolder.useranswer.addTextChangedListener(新的TextWatcher(){
@凌驾
公共无效后文本更改(可编辑的s){}
@凌驾
public void beforeTextChanged(字符序列s、int start、int count、int after){}
@凌驾
public void onTextChanged(字符序列、int start、int before、int count)
{
如果(s.toString().length()>0){
Log.d(“TestViewAdapterb”、“pos-”+rowPosition+”、“+s.toString());
myinputs.put(rowPosition,s.toString());
}
}
});
字符串v=myinputs.get(rowPosition);
viewHolder.useranswer.setText(v==“”?“”:v);
}
}
我找到了方法,下面是我为保存用户输入而更新的代码。
希望对一些人有帮助
public class TestViewAdapter extends CursorAdapter
{
protected Cursor cursor;
protected Context context;
protected Resources res;
protected Random random;
protected LayoutInflater inflater;
protected ArrayList<HashMap<String,String>> resultList;
protected int mRowIDColumn;
public TestViewAdapter(Context context, Cursor c)
{
super(context, c);
this.cursor = c;
this.context = context;
this.res = this.context.getResources();
this.random = new Random();
boolean cursorPresent = c != null;
mRowIDColumn = cursorPresent ? this.cursor.getColumnIndexOrThrow("_id") : -1;
this.inflater = (LayoutInflater) this.context.getSystemService(this.context.LAYOUT_INFLATER_SERVICE);
resultList = new ArrayList<HashMap<String,String>>();
if(c != null && c.getCount() > 0)
{
c.moveToFirst();
for (int i=0;i<c.getCount();i++)
{
HashMap<String,String> row = new HashMap<String,String>();
row.put("userans","");
resultList.add(row);
}
}
}
private static class Viewholder
{
TextView question;
TextView answer;
EditText useranswer;
String randomStr ="";
}
public ArrayList<HashMap<String,String>> getUserInputResult()
{
return resultList;
}
@Override
public View newView(Context context, Cursor c, ViewGroup parent)
{
View rowlayout = this.inflater.inflate(R.layout.testlist_row, null);
final Viewholder viewHolder;
String [] meaningArray = new String[] {"synonyms", "antonyms"};
viewHolder = new Viewholder();
// Set view for each row
viewHolder.question = (TextView) rowlayout.findViewById(R.id.tv_test_question);
viewHolder.answer = (TextView) rowlayout.findViewById(R.id.tv_test_answer);
viewHolder.useranswer = (EditText) rowlayout.findViewById(R.id.et_test_useranswer);
viewHolder.randomStr = meaningArray[this.random.nextInt(meaningArray.length)];
viewHolder.useranswer.clearFocus();
rowlayout.setTag(viewHolder);
return rowlayout;
}
@Override
public int getCount() {
return cursor.getCount();
}
@Override
public long getItemId(int position) {
if (cursor != null) {
if (cursor.moveToPosition(position)) {
return cursor.getLong(mRowIDColumn);
} else {
return 0;
}
} else {
return 0;
}
}
@Override
public void bindView(View view, Context context, Cursor c)
{
final Viewholder viewHolder = (Viewholder) view.getTag();
final int rowPosition = (int) getItemId(cursor.getPosition());
final int rowId = cursor.getInt(cursor.getColumnIndex(cursor.getColumnName(0)));
boolean isBoth = false, isSyno = false , isAnto = false, isQuestionset = false;
String que = "";
String synonyms = "";
String antonyms = "";
String word = "";
String text = "";
String ans = "";
que = this.res.getString(R.string.popup_question);
word = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(1)));
synonyms = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(2)));
antonyms = cursor.getString(cursor.getColumnIndex(cursor.getColumnName(3)));
if (!synonyms.isEmpty() && !antonyms.isEmpty())
{
isBoth = true;
isSyno = true;
isAnto = true;
}
else if (!synonyms.isEmpty())
{
isSyno = true;
}
else if (!antonyms.isEmpty())
{
isAnto = true;
}
if (isBoth)
{
if(viewHolder.randomStr.equals("synonyms"))
{
text = String.format(que, "synonyms", word.toLowerCase());
ans = synonyms;
}
else
{
text = String.format(que, "antonyms", word.toLowerCase());
ans = antonyms;
}
}
else if (isSyno)
{
if (viewHolder.randomStr.equals("synonyms"))
{
text = String.format(que, "synonyms", word.toLowerCase());
ans = synonyms;
isQuestionset = true;
}
else if (isAnto)
{
text = String.format(que, "antonyms", word.toLowerCase());
ans = antonyms;
isQuestionset = true;
}
if (!isQuestionset)
{
text = String.format(que, "synonyms", word.toLowerCase());
ans = synonyms;
isQuestionset = true;
}
}
else if (isAnto)
{
text = String.format(que, "antonyms", word.toLowerCase());
ans = antonyms;
}
viewHolder.question.setText(text);
viewHolder.answer.setText(ans);
HashMap<String,String> row = resultList.get(c.getPosition());
row.put("preans",ans);
viewHolder.useranswer.setId(cursor.getPosition());
viewHolder.useranswer.setOnFocusChangeListener(new View.OnFocusChangeListener() {
@Override
public void onFocusChange(View v, boolean hasFocus)
{
if (!hasFocus)
{
if (((EditText)v).getText().toString().length() > 0) {
Log.d("TestViewAdapterb", "pos -" + rowPosition + "," + ((EditText)v).getText().toString().trim());
HashMap<String,String> row = resultList.get(v.getId());
row.put("userans",((EditText)v).getText().toString().trim());
}
}
}
});
viewHolder.useranswer.setText(row.get("userans"));
}
}
公共类TestViewAdapter扩展游标适配器
{
保护光标;
受保护的语境;
受保护资源;
保护随机;
充气机;
受保护的ArrayList结果列表;
受保护的int-mRowIDColumn;
公共TestViewAdapter(上下文,游标c)
{
超级(上下文,c);
this.cursor=c;
this.context=上下文;
this.res=this.context.getResources();
this.random=新的random();
布尔cursorPresent=c!=null;
mRowIDColumn=cursorPresent?this.cursor.getColumnIndexOrThrow(“\u id”):-1;
this.inflater=(LayoutInflater)this.context.getSystemService(this.context.LAYOUT\u充气器\u服务);
结果列表=新的ArrayList();
如果(c!=null&&c.getCount()>0)
{
c、 m
text = String.format(viewHolder.que, "synonyms", word.toLowerCase());