2017-08-26 3 views
3

Ich versuche, eine einfache Aufgabenliste App mit einem RecyclerView mit einem benutzerdefinierten Adapter zu erstellen. Ich habe eine Modelldatenklasse erstellt, um meine Todos zu erhalten und zu setzen. Mein Problem ist, dass jedes Mal, wenn ich auf die Schaltfläche klicke, um meinen Artikel hinzuzufügen, nichts passiert. Ich habe notifyDataSetChanged() Methode aufgerufen, aber es funktioniert immer noch nicht.Wie kann ich Benutzerdaten über OnClick zu meinem Recyclerview hinzufügen?

Dies ist eine Praxis-App, die ich RecyclerViews und benutzerdefinierte Adapter zu bauen, so würde ich es schätzen, wenn jemand erklären könnte, warum es nicht funktioniert und mir vielleicht erklären, wie ich es beheben kann.

Dies ist mein Code, wo ich die Benutzereingabe von dem EditText Feld bin abgerufen und in meinen Daten Abdrucken:

public class MainActivity extends AppCompatActivity { 

     private ToDoData toDoData; 

     private List<ToDoData> toDoList = new ArrayList<>(); 

     @Override 
     protected void onCreate(Bundle savedInstanceState) { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_main); 

      final ToDoAdapter toDoAdapter = new ToDoAdapter(toDoList, this); 
      toDoData = new ToDoData(this); 

      final EditText toDoInput = (EditText)findViewById(R.id.add_todo); 
      Button toDoAdd = (Button)findViewById(R.id.add_item); 

      RecyclerView.LayoutManager layoutManager = new LinearLayoutManager(this); 
      RecyclerView toDoDisplay = (RecyclerView) findViewById(R.id.toDoDisplayRecyclerView); 
      toDoDisplay.setAdapter(toDoAdapter); 
      toDoDisplay.setHasFixedSize(true); 
      toDoDisplay.setLayoutManager(layoutManager); 


      toDoAdd.setOnClickListener(new View.OnClickListener() { 
       @Override 
       public void onClick(View view) { 
        toDoData.setToDo(toDoInput.getText().toString()); 
        toDoAdapter.notifyDataSetChanged(); 
       } 
      }); 

     } 
    } 

Das ist meine Modellklasse mit Getter und Setter. Das Listenelement hat nur 1 Feld, also ist es eher klein:

public class ToDoData { 
    private String toDoString; 

    public ToDoData(String todoString){ 
     this.toDoString = todoString; 
    } 

    public ToDoData(Context context){} 

    public String getToDo() { 
     return toDoString; 
    } 

    public void setToDo(String toDoString) { 
     this.toDoString = toDoString; 
    } 
} 

Und das ist mein benutzerdefinierter Adapter. Ich folgte ein Tutorial durch, während das Gebäude, aber ich glaube aber, dass mein Problem aus dem Adapter stammt:

public class ToDoAdapter extends RecyclerView.Adapter<ToDoAdapter.ViewHolder> { 

    private List<ToDoData> toDoList; 
    private Context context; 

    public ToDoAdapter(List<ToDoData> todoList, Context context) { 
     this.toDoList = todoList; 
     this.context = context; 
    } 

    public class ViewHolder extends RecyclerView.ViewHolder { 
     TextView todoView; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      todoView = (TextView) itemView.findViewById(R.id.to_do_display); 
     } 
    } 

    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
     View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.to_do_list_item, parent, false); 
     return new ViewHolder(view); 
    } 

    @Override 
    public void onBindViewHolder(ViewHolder holder, int position) { 
     ToDoData todo = toDoList.get(position); 

     holder.todoView.setText(todo.getToDo()); 
    } 

    @Override 
    public int getItemCount() { 
     return (toDoList == null) ? 0 : toDoList.size(); 
    } 
} 
+2

wie füge u Daten zu 'toDoList'? und wo rufst du 'notifyDataSetChanged()' auf dem Adapter an? Aus Ihrem Code haben Sie eine leere 'toDoList' an den Adapter übergeben! –

+0

@AtefHares Sorry Korrektur * Ich habe 'notifyDataSetChanged' in meinem Button onClick aufgerufen, aber es hat nicht funktioniert. –

+2

Ihre 'toDoList' ist leer es hat keine Elemente, weil Sie' toDoList.add (toDoData) 'nicht verwendet haben und somit die' notifyDataSetChanged() 'keine Auswirkung hat! –

Antwort

2

Fügen Sie eine Setter-Methode in Ihrer Adapterklasse für die Gewinnung und dann notifyDataSetChanged aufrufen.

Deklarieren Sie die ToDoAdapter als Klassenmitglied und dann die Set-Funktion auf Button Klick aufrufen wie folgt,

adapter.setTodoList(/* pass collection */); 
adapter.notifyDataSetchanged(); 
+0

Kinda verwirrt. Ich erhalte die Benutzereingabe von meiner MainActivity. Wie kann ich das im Adapter machen und warum? –

+1

Überprüfen Sie die Adapterimplementierung. Sie übergeben die Auflistung zum Zeitpunkt der Adapterinitialisierung. Wie werden Sie dann die Sammlung innerhalb des Adapters von der Aktivität aktualisieren? – young

+0

"Wie Sie die Sammlung innerhalb des Adapters von der Aktivität aktualisieren werden" - nun, die Liste ist ein Feld (Mitgliedsvariable) der Aktivität, so dass es kein Problem ist, ein Element zu dieser Liste in onClick() hinzuzufügen. Der Adapter hält sich an der Liste fest, sodass Änderungen an der Liste der Aktivitäten Änderungen an der Liste des Adapters sind. – 0X0nosugar

Verwandte Themen