Question

J'ai AA ListView avec chaque ligne ayant un champ de texte et un champ EditText. Je les ai tous se battre à l'écran. Lorsque je reprends l'activité en obtenant un appel, en remontant, etc., l'entrée dans les champs EditText ne correspond pas à ce qui a été initialement entré. Je me demandais comment je pouvais configurer onResume ou un état instantané enregistré pour éviter cela et assurer que l'entrée correcte se trouve dans le champ EditText correct.

C'est le code avec lequel je travaille.

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

    /** Called when the activity is first created. */
    @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();
            adapter.notifyDataSetChanged();
    }


            //footer button
            public void onClick(View footer){
                    final MediaPlayer editClickSound = MediaPlayer.create(this, R.raw.button50);
                    editClickSound.start();
                    if (ItemAdapter.inputValues.containsValue("")){
                        Toast.makeText(this, "Please fill in all fields", 1000).show();
                          }else{
                          startActivity(new Intent("wanted.pro.madlibs.OUTPUT"));
                                };

                }
...

            }
            @Override
            protected void onResume() {
                super.onResume();
            }

            @Override
            protected void onPause() {

                super.onPause();

            }


        }
//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 implements TextWatcher {
        protected TextView text;
        protected EditText edittext;
        protected int position;

        public void afterTextChanged(Editable editable) {
            Log.e(String.valueOf(position), "Position 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.edittext.addTextChangedListener(holder);
            holder.position = position;
            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);

        return convertView;

    }
}
Était-ce utile?

La solution

Tout d'abord, les éditeurs dans ListViews sont une grande douleur dans le cul, juste au cas où vous commenceriez à rencontrer des problèmes. Deuxièmement, vous ne semblez pas sauver le inputValue cordes à tout moment. Au moins vous devez sérialiser les valeurs en onSaveInstanceState() et les lire onCreate(). Vous ne devriez pas non plus les stocker dans l'adaptateur. Vous devriez vraiment avoir un "modèle" approprié (un objet avec des valeurs d'étiquette et d'entrée) soutenant l'adaptateur. Un SimplecursorAdapter n'est pas très bien adapté pour modifier les données en parallèle.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top