Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/224.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 如何在自定义游标适配器中保留edittext值_Android_Listview_Android Cursoradapter_Android Viewholder - Fatal编程技术网

Android 如何在自定义游标适配器中保留edittext值

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

在将几乎所有来自堆栈溢出的答案应用于同一主题后,我无法找到问题的解决方案。 我的问题是我有一个列表视图,其中每行包含一个问题和一个编辑文本。但当我在编辑文本中滚动列表视图数据时,它可能会在其他编辑文本中更改或发生。 i、 e如果我在滚动之后在第1行编辑文本中写一些东西,它可能会出现在第2行或第3行编辑文本中

我甚至在cursoradapter类中尝试过一些东西,但仍然是

请帮帮我,伙计们

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());