2016-07-31 20 views
1

Ich habe zwei Aktivitäten: AddUser und ToDo. ToDo implementiert eine Klasse mit Callback. ToDo ermöglicht es dem Benutzer, eine Aufgabenliste zu erstellen, und die Aufgaben werden sofort in einer recyclerView angezeigt. Der Benutzer kann Elemente in ToDo hinzufügen, aktualisieren oder löschen.Android - Übergeben Sie eine Absicht von einer Aktivität an eine andere, die eine Callback-Klasse mit Firebase implementiert

AddUser.java

public class AddUser extends AppCompatActivity implements View.OnClickListener{ 

private DatabaseReference mUserRef; 

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

mUserRef = FirebaseDatabase.getInstance().getReference().child("users"); 

EditText etUserid = (EditText) findViewById(R.id.etUserid); 
EditText etUsername = (EditText) findViewById(R.id.etUsername); 
Button btnNext = (Button) findViewById(R.id.btnNext); 

btnNext.setOnClickListener(this); 
} 

public void addUser(UserDetails userDetails){ 
userPushKey = mUserRef.push().getKey(); 
mUserRef.child(userPushKey).setValue(userDetails); 
} 

@Override 
public void onClick(View v){ 
if(v == btnNext){ 
String inputUserid = etUserid.getText().toString(); 
String inputUsername = etUsername.getText().toString(); 

addUser(new UserDetails(inputUserid, inputUsername)); 

Intent intent = new Intent(AddUser.this,ToDo.class); 
intent.putExtra("userKeyRef", userPushKey); 
startActivity(intent); 
} 
} 
} 

ToDo.java

public class ToDo extends AppCompatActivity implements UserTodoAdapter.Callback { 

private UserTodoAdapter mAdapter; 

@Override 
protcted void onCreate(Bundle savedInstanceState) { 
super.onCreate(savedInstanceState); 
setContentView(R.layout.activity_todo); 

mAdapter = new UserTodoAdapter(this); 
RecyclerView view = (RecyclerView) findViewById(R.id.recycler_view); 
view.setHasFixedSize(true); 
view.setAdapter(mAdapter); 
} 

@Override 
public void onEdit(final UserTodo userTodo){ 
// some functions here 
} 
} 

UserTodoAdapter.java

public class UserTodoAdapter extends RecyclerView.Adapter<UserTodoAdapter.ViewHolder> { 
private List<UserTodo> mUserTodo; 
private Callback mCallback; 
private DatabaseReference mUserTodoRef; 

public UserTodoAdapter(Callback callback) { 
mCallback = callback; 
mUserTodo = new ArrayList<>(); 

// need to get the push key from AddUser activity 
mUserTodoRef = FirebaseDatabase.getInstance.getReference().child(users).child("Need the push key here").child("todo"); 
mUserTodoRef.addChildEventListener(new TodoChildEventListener()); 
} 

private class TodoChildEventListener implements ChildEventListener{ 
    @Override 
    public void onChildAdded(DataSnapshot dataSnapshot, String s){ 
     // action here 
    } 

    @Override 
    public void onChildChanged(DataSnapshot dataSnapshot, String s){ 
     // action here 
    } 

    @Override 
    public void onChildRemoved(DataSnapshot dataSnapshot){ 
     // action here 
    } 

    @Override 
    public void onChildMoved(DataSnapshot dataSnapshot, String s){ 
     // action here 
    } 

    @Override 
    public void onCancelled(DatabaseError databaseError){ 
     // action here 
    } 
} 

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

@Override 
public void onBindViewHolder(ViewHolder holder, final int position){ 
    final UserTodo userTodo = mUserTodo.get(position); 
    holder.mTodoTitle.setText(userTodo.getTodoTitle()); 
    holder.mTodoDesc.setText(userTodo.gerTodoDesc()); 
    holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      mCallback.onEdit(userTodo); 
     } 
    }); 

    holder.itemView.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      removeTodo(mUserTodo.get(position)); 
      return true; 
     } 
    }); 
} 

@Override 
public int getItemCount(){ 
    return mUserTodo.size(); 
} 

public interface Callback{ 
    public void onEdit(UserTodo userTodo); 
} 

class ViewHolder extends RecyclerView.ViewHolder{ 
    private TextView mTodoTitle; 
    private TextView mTodoDesc; 

    public ViewHolder(View itemView){ 
     super(itemView); 
     mTodoTitle = (TextView) itemView.findViewById(R.id.tvTodoTitle); 
     mTodoDesc = (TextView) itemView.findViewById(R.id.tvTodoDesc); 
    } 
} 

public void addTodo(UserTodo userTodo){ 
    mUserTodoRef.push().setValue(userTodo); 
} 

public void updateTodo(UserTodo userTodo, String newTodoTitle, String newTodoDesc){ 
    userTodo.setTodoTitle(newTodoTitle); 
    userTodo.setTodoDesc(newTodoDesc); 
    mUserTodoRef.child(userTodo.getTodoKey()).setValue(userTodo); 
} 

public void removeTodo(UserTodo userTodo){ 
    mUserTodoRef.child(userTodo.getTodoKey()).removeValue(); 
} 
} 

Nachdem der Benutzer auf Schaltfläche Weiter in AddUser Aktivität geklickt wird, die Benutzerdaten straightly zu Firebase hinzugefügt, und der Benutzer wird zuumgeleitet 210 Seite, auf der der Benutzer Aufgaben hinzufügen kann. Wie übergibt man den in AddUser erstellten Push-Key, so dass, wenn der Benutzer die Aufgaben hinzufügt, die Artikel unter dem Benutzer hinzugefügt werden?

Wird Absicht richtig verwendet?

Bitte fragen Sie mich nicht, warum ich den Benutzer direkt nach der Erstellung des Benutzers zur Aufgabenliste hinzufügen lassen muss. So ist es nötig.

Dank

Edit: Es tut mir leid, ich sollte erwähnen, dass die Absicht zu UserTodoAdapter-Klasse übergeben werden sollte, so dass in der Firebase Datenbankreferenz von UserTodoAdapter ich den Verweis auf die von AddUser weitergegeben Schlüssel verweisen.

Ich habe Klassen UserDetails und UserTodo, für Aktivitäten AddUser und ToDo bzw. Daten in Firebase zu handhaben.

Schließlich werden die Daten wie folgt aussehen:

{ 
    "users":{ 
    "push_id":{ 
     "userid":"123456", 
     "username":"My User", 
     "todo_s":{ 
      "push_id":{ 
       "todo1":"Title1", 
       "todo_desc":"Description" 
      }, 
      "push_id":{ 
       "todo2":"Title2", 
       "todo_desc":"Description" 
      }, 
     } 
    }, 
    } 
} 

Antwort

1

über Absicht Passing (von AddUser zu ToDo) ist in Ordnung. Oder Sie speichern sie in einem lokalen Speicher wie SharedPreferences, so dass Ihr Benutzer keinen neuen Benutzer erstellen muss, wenn der Benutzer einen neuen Benutzer erstellt hat.

Um den Schlüsselwert von Ihrem ToDo Aktivität an den Adapter übergeben, des Adapters Konstruktor ändern Schlüsselparameter, indem Sie die Zeichenfolge Extra aus der vorherigen Aktivität

public UserTodoAdapter(Callback callback, String key) { 
    mCallback = callback; 
    mUserTodo = new ArrayList<>(); 
    mUserTodoRef = FirebaseDatabase.getInstance.getReference().child(users).child(key).child("todo"); 
} 

Und im ToDo, instanziiert den Adapter zu akzeptieren (AddUser).

mAdapter = new UserTodoAdapter(this, getIntent().getStringExtra("key")); 
+0

Können Sie vorschlagen, wie Sie den Wert von "AddUser" zu "UserTodoAdapter" übergeben? –

+0

das kann nicht direkt getan werden, da 'UserTodoAdapter' in einer anderen Aktivität deklariert ist, die' ToDo' ist, außer das 'UserTodoAdapter' im AddUser deklariert ist – Wilik

+0

Yeah I know. Deshalb kann ich nicht herausfinden, wie ich den Wert "UserTodoAdapter" übergeben soll. –