0

将堆栈溢出中的几乎所有答案应用于同一主题后,我找不到解决方案。 我的问题是我有一个列表视图,其中包含一个问题和每行中的编辑文本。但是当我滚动列表视图数据编辑文本更改或它可能发生它来自其他编辑文本。 即,如果我在第一个editext中写了一些东西后滚动它可能发生它是在第二或第三行edittext。如何保留自定义光标适配器中的edittext值

一些我甚至从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); 

    } 
} 

我得到了方法,下面是我的更新代码,以保留用户输入。希望对某些机构有所帮助。

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")); 
    } 
} 

一件事添加

机器人:descendantFocusability = “beforeDescendants”

这将允许孩子以获得焦点,当用户点击列表view.To店项目当用户滚动列表视图时,我使用了包含hashmap对象的arraylist。我学到的第二件事是,从来没有使用'=='的比较字符串代替它使用isEmpty方法或包含方法。

回答

0

我想这个问题就出在这行:

text = String.format(viewHolder.que, "synonyms", word.toLowerCase()); 

我之所以说这是因为你引用ViewHolder来获取文本的价值。由于ViewHolder回收,您的文本的价值也将回收。

尝试直接从光标获取文本的值,而不需要ViewHolder的干预。

+0

您能否详细说明 - 尝试直接从光标获取文本的值,而不需要ViewHolder的干预。你的意思是我必须直接在bindview中获取字符串。 ? – androidnoobdev 2014-10-09 19:26:45

+0

是的,确切地说。当值取决于回收的ViewHolder时,该值将受到影响。 – 2014-10-09 19:57:33

+0

我试过这个解决方案,但没有工作。我的问题是保留或保留编辑文本值。我的意思是用户在滚动时回答,直到用户点击提交。 – androidnoobdev 2014-10-12 12:10:52