2012-02-26 2 views
1

У меня есть Listview с пользовательским адаптером курсора. Я пытаюсь предотвратить ввод данных в поле edittext. Я работал с Hashmap. Он работает, когда вы сначала прокручиваете вниз (чтобы не использовать данные из 0 и т. Д. Во вновь показанном виде). Но когда вы прокручиваете резервную копию, она снова загружает входы. Я надеюсь, что кто-то здесь может определить мою проблему. Bc. Я посмотрел на другую публикацию с вопросом об утилизированных входах с edittext, и я не вижу, что я делаю неправильно по сравнению с тем, что работает для других.Вход в EditText, возвращенный даже с Hashmap

public class editview extends ListActivity { 
    private dbadapter mydbhelper; 
    public static int editCount; 
    public static ListView listView; 
    public ItemAdapter adapter; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     mydbhelper = new dbadapter(this); 
      mydbhelper.open(); 


     View footer = getLayoutInflater().inflate(R.layout.footer_layout, null); 
     ListView listView = getListView(); 
     listView.addFooterView(footer); 
     showResults(); 
     } 

    //Populate view 
    private void showResults(){ 
     Cursor cursor = mydbhelper.getUserWord(); 
     startManagingCursor(cursor); 
     String[] from = new String[] {dbadapter.KEY_USERWORD}; 
     int[] to = new int[] {R.id.textType}; 
     adapter = new ItemAdapter(this, R.layout.edit_row, cursor, 
         from, to); 
      adapter.notifyDataSetChanged(); 
      this.setListAdapter(adapter); 
      editCount = adapter.getCount(); 

    } 


      //footer button 
      public void onClick(View footer){ 
        final MediaPlayer editClickSound = MediaPlayer.create(this, R.raw.button50); 
        editClickSound.start(); 
        startActivity(new Intent("wanted.pro.madlibs.OUTPUT")); 

       } 
...   
//custom cursor adapter 
class ItemAdapter extends SimpleCursorAdapter { 

    private LayoutInflater mInflater; 
    private Cursor cursor; 
    static Map<Integer, String> inputValues = new LinkedHashMap<Integer, String>(); 
    static String oldText; 


    public ItemAdapter(Context context, int layout, Cursor cursor, String[] from, 
      int[] to) { 
     super(context, layout, cursor, from, to); 
     this.cursor = cursor; 
     mInflater = LayoutInflater.from(context); 

    } 


    static class ViewHolder { 
     protected TextView text; 
     protected EditText edittext; 

     } 

    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 


     ViewHolder holder; 
     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.edit_row, null); 


      holder = new ViewHolder(); 
      holder.text = (TextView) convertView.findViewById(R.id.textType); 
      holder.edittext = (EditText) convertView.findViewById(R.id.editText); 


      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 

     } 
     cursor.moveToPosition(position); 
     int label_index = cursor.getColumnIndex("userword"); 
     String label = cursor.getString(label_index); 

     holder.text.setText(label); 
     oldText = inputValues.get(position); 
     holder.edittext.setText(oldText == null ? "" : oldText); 


     holder.edittext.addTextChangedListener(new TextWatcher(){ 
      public void afterTextChanged(Editable editable) { 
       inputValues.put(position, editable.toString()); 
       //Log.e(String.valueOf(position), "position in Hashmap"); 
       //Log.e(inputValues.get(position), "data in Hashmap"); 
      } 

      public void beforeTextChanged(CharSequence s, int start, 
        int count, int after) { 
       // TODO Auto-generated method stub 

      } 

      public void onTextChanged(CharSequence s, int start, 
        int before, int count) { 
       // TODO Auto-generated method stub 

      } 

     }); 

     return convertView; 

    } 
} 

Я попытался это ниже код, но он закончил тем, что мой переработаны вид называется положение 0.

static class ViewHolder implements TextWatcher { 
    protected TextView text; 
    protected EditText edittext; 
    protected int position; 

    public void afterTextChanged(Editable editable) { 
     Log.e(String.valueOf(position), "Position in array"); 
     Log.e(editable.toString(), "data in array"); 
     inputValues.put(position, editable.toString()); 

    } 
    public void beforeTextChanged(CharSequence s, int start, int count, 
      int after) { 
     // TODO Auto-generated method stub 

    } 
    public void onTextChanged(CharSequence s, int start, int before, 
      int count) { 
     // TODO Auto-generated method stub 

    } 

    } 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 


    ViewHolder holder; 
    if (convertView == null) { 
     convertView = mInflater.inflate(R.layout.edit_row, null); 


     holder = new ViewHolder(); 
     holder.text = (TextView) convertView.findViewById(R.id.textType); 
     holder.edittext = (EditText) convertView.findViewById(R.id.editText); 
     holder.position = position; 
     holder.edittext.addTextChangedListener(holder); 

     convertView.setTag(holder); 

    } else {.... 

ответ

0

Вы, вероятно, хотите, чтобы удалить старые экземпляры TextWatcher перед добавлением новых. Похоже, у вас есть возможности для нескольких TextWatchers, которые просматривают один и тот же EditText для нескольких позиций в списке, что может привести к тому, что переработка изображений пошла не так.

+0

Есть ли способ удалить или предотвратить добавление нового, если он уже подключен без настройки подкласса textwatcher? Я боюсь, если я подклассифицирую его, я получаю чертовски время, получая inputValues.put (position, editable.toString()); (нужно убедиться, что данные помещаются в ту же позицию, что и edittext) – maebe

+1

Вам не нужно это делать. Просто реализуйте TextWatcher в вашем классе ViewHolder и делайте addTextChangedListener() только при раздувании представлений. Это дает вам один TextWatcher в EditText. Затем вам нужно будет добавить «позицию» в ViewHolder, чтобы вы могли найти данные, соответствующие строке в afterTextChanged(). –

Смежные вопросы