私は2つのアクティビティ:AddUser
とToDo
を持っています。 ToDo
は、コールバックを持つクラスを実装します。 ToDo
は、ユーザーが予定リストを作成することを可能にし、to doアイテムはrecyclerViewに即座に表示されます。ユーザーは、ToDo
でアイテムを追加、更新、または削除することができます。Android - Firebaseでコールバッククラスを実装する別のアクティビティにインテントを渡します
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();
}
}
ユーザがAddUser
活性Nextボタンをクリックした後に、ユーザデータは直線でありますFirebaseに追加され、ユーザはにリダイレクトされますユーザーがアイテムに追加できる210ページ。 AddUser
で作成されたプッシュキーを渡す方法。ユーザーがdoアイテムを追加すると、アイテムはユーザーの下に追加されます。
意図を正しい方法で使用していますか?
私はユーザーが作成された直後にユーザーがリストに追加する必要がある理由を聞かないでください。このように必要です。
おかげ
編集:私は、私はUserTodoAdapter
のFirebaseデータベース参照で、私はAddUser
から渡されたキーへの参照を指すことができるように意図は、UserTodoAdapter
クラスに渡す必要があることを言及する必要がありますごめんなさい。
私はクラスUserDetails
とUserTodo
を持っていますが、それぞれAddUser
とToDo
というアクティビティでFirebaseのデータを処理しています。
最終的にデータは次のようになります。
{
"users":{
"push_id":{
"userid":"123456",
"username":"My User",
"todo_s":{
"push_id":{
"todo1":"Title1",
"todo_desc":"Description"
},
"push_id":{
"todo2":"Title2",
"todo_desc":"Description"
},
}
},
}
}
「AddUser」の値を「UserTodoAdapter」に渡す方法を提案できますか? –
'UserTodoAdapter'がAddUserで' UserTodoAdapter'が宣言されていない限り、 'ToDo'である別のアクティビティで宣言されているため、直接行うことはできません。 – Wilik
ええ、私は知っています。それで、私が望む値を 'UserTodoAdapter'に渡す方法を理解できないのです。 –