2016-05-12 5 views
1

Ich habe Probleme, die gesamte Zeichenfolge richtig in meine Arraylist zu bekommen. Ich gehe davon aus, dass der Fehler etwas mit meinem benutzerdefinierten Textwatcher zu tun hat oder wie ich die Array-Liste durchlaufen habe. Hier ist mein Code:Eine String ArrayList in die SQLite-Datenbank schreiben

 case R.id.action_add: 
       Workout workout = new Workout("", "", "", ""); 
       workoutList.add(workout); 

       ListView exerciseList = (ListView) findViewById(R.id.exerciseListView); 
       CustomAdapter myAdapter = new CustomAdapter(this, R.layout.custom_list, workoutList); 
       exerciseList.setAdapter(myAdapter); 

       return true; 
      default: 
       return super.onOptionsItemSelected(item); 
     } 
    } 

    public class CustomAdapter extends ArrayAdapter<Workout> { 

     private int layoutResource; 

     public CustomAdapter(Context context, int layoutResource, List<Workout> workoutList) { 
      super(context, layoutResource, workoutList); 
      this.layoutResource = layoutResource; 
     } 

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

      View view = convertView; 

      if (view == null) { 
       LayoutInflater layoutInflater = LayoutInflater.from(getContext()); 
       view = layoutInflater.inflate(layoutResource, null); 

      } 

      Workout workout = getItem(position); 

      if (workout != null) { 
       final EditText exercise = (EditText) view.findViewById(R.id.exercise); 
       final EditText reps = (EditText) view.findViewById(R.id.reps); 
       final EditText sets = (EditText) view.findViewById(R.id.sets); 

       if (exercise != null){ 
        exercise.addTextChangedListener(new CustomWatcher(exercise)); 
       } 

       if (reps != null) { 
        reps.addTextChangedListener(new CustomWatcher(reps)); 
       } 

       if (sets != null) { 
        sets.addTextChangedListener(new CustomWatcher(sets)); 
       } 
      } 

      return view; 
     } 
    } 
    //Textwatcher class 
    class CustomWatcher implements TextWatcher { 

     private View view; 
     public CustomWatcher(View view) { 
      this.view = view; 
     } 

     public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 
     public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {} 
     public void afterTextChanged(Editable editable) { 
      String text = editable.toString(); 
      switch (view.getId()) { 

       //exercises 
       case R.id.exercise: 
        exercises.add(text); 
        break; 
       //reps 
       case R.id.reps: 
        reps.add(text); 
        break; 
       //sets 
       case R.id.sets: 
        sets.add(text); 
        break; 
      } 
     } 
    } 
} 

Die Fälle sind Tasten. Wenn ich auf die Schaltfläche "Hinzufügen" klicke, versuche ich, meine benutzerdefinierte Listenansicht zu meiner Seite hinzuzufügen, die drei Textansichten enthält. Wenn ich dann auf "Speichern" klicke, versuche ich, die Daten von jeder Textposition in eine Array-Liste zu speichern, um sie in meiner Datenbank zu speichern.

@Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle item selection for menu 
     switch (item.getItemId()) { 
      case R.id.action_save: 

       String title = MyWorkoutsActivity.workouts.get(workoutID); 
       String ex; 
       String rp; 
       String st; 
       SQLDatabase db = new SQLDatabase(this); 
       for(int i = 0; i < workoutList.size(); i++){ 
        //exercises, reps, and sets always same number so only one for loop needed 
        ex = exercises.get(i); 
        rp = reps.get(i); 
        st = sets.get(i); 
        db.addExercise(new Workout(title, ex, rp, st)); 

       } 
       List<Workout> workouts = db.getAllExercises(); 

       for (Workout wo : workouts) { 
        String log = "Workout " + wo.getWorkout() + "Exercise " + wo.getExercise() + " ,Reps " + wo.getReps() + " ,Sets " + wo.getSets(); 
        // Writing workouts to log 
        Log.d("Workout ", log); 
       } 
       Intent intent = new Intent(this, MyWorkoutsActivity.class); 
       startActivity(intent); 

       return true; 

Antwort

0

Dies geschieht, weil die Listener-Methode afterTextChanged nach dem ersten Buchstaben eingegeben, so wird er die ersten Buchstaben in die Liste speichern und so weiter zu Mittag gegessen wird, bis Sie mit einer Liste von Zeichen enden.

die Lösung: einfach nicht die textwatcher verwenden, weil Sie die Daten speichern wollen, wenn der Benutzer die Speichertaste, um die Daten an die Übungen Liste hinzufügen, wenn die Schaltfläche wie dieser Code getroffen wird:

public void onClick(View view){ 
    //the exercise and reps and sets are the EditText fields that you have 
    exercises.add(exercise.getText()); 
    exercises.add(reps.getText()); 
    exercises.add(sets.getText()); 

} 
+0

Vielen Dank! Das einzige Problem dabei ist, wie würde ich auf jede Listenansichtszeile separat Bezug nehmen, um die Bearbeitungstextdaten hinzuzufügen? Es ist keine festgelegte Anzahl von Zeilen, es gibt so viele Zeilen wie die Anzahl der Male, die der Benutzer gedrückt hat, add new. – Achall9

+0

Ich denke, dieses Tutorial wird helfen: http://www.tutorialspoint.com/android/android_list_view.htm Dies wird den Trick für Sie tun, wenn Sie die Liste nicht dynamisch ändern möchten (die Schaltfläche Speichern ist in einer anderen Aktivität als die Listenansicht) – Omar

Verwandte Themen