Frage

Ich habe eine Listenansicht, in der jede Zeile ein Textfeld und ein Bearbeitungstextfeld hat.Ich lasse sie alle auf dem Bildschirm kämpfen.Wenn ich die Aktivität fortsetze, indem ich entweder einen Anruf erhalte, zurückgehe usw., stimmt die Eingabe in den Bearbeitungstextfeldern nicht mit der ursprünglichen Eingabe überein.Ich habe mich gefragt, wie ich „onresume“ oder einen gespeicherten Sofortstatus einrichten könnte, um das zu verhindern und sicherzustellen, dass sich die richtige Eingabe im richtigen Edittext-Feld befindet.

Dies ist der Code, mit dem ich arbeite.

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;

    }
}
War es hilfreich?

Lösung

Erstens sind EditTexts in ListViews eine große Nervensäge, für den Fall, dass Sie auf Probleme stoßen.Zweitens scheinen Sie das nicht zu retten inputValue Saiten an jeder Stelle.Zumindest sollten Sie die Werte in serialisieren onSaveInstanceState() und lies sie noch einmal durch onCreate().Sie sollten sie auch nicht im Adapter aufbewahren.Sie sollten wirklich über ein richtiges „Modell“ (ein Objekt mit Beschriftung und Eingabewerten) verfügen, das den Adapter unterstützt.Ein SimpleCursorAdapter eignet sich nicht sehr gut zum parallelen Ändern von Daten.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top