2016-07-31 17 views
1

私は2つのアクティビティ:AddUserToDoを持っています。 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クラスに渡す必要があることを言及する必要がありますごめんなさい。

私はクラスUserDetailsUserTodoを持っていますが、それぞれAddUserToDoというアクティビティで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" 
      }, 
     } 
    }, 
    } 
} 

答えて

1

は(AddUserからToDoに)意図を経由して渡すと罰金です。または、SharedPreferencesのようなローカルストレージに保存して、ユーザーが新しいユーザーを作成した場合に新しいユーザーを作成する必要はありません。

、アダプタにごToDo活動からキー値を渡す

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

そしてToDoに重要なパラメータを受け入れるために、アダプタのコンストラクタを変更し、以前の活動から余分な文字列を渡すことで、アダプタをインスタンス化します(AddUser)。

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

「AddUser」の値を「UserTodoAdapter」に渡す方法を提案できますか? –

+0

'UserTodoAdapter'がAddUserで' UserTodoAdapter'が宣言されていない限り、 'ToDo'である別のアクティビティで宣言されているため、直接行うことはできません。 – Wilik

+0

ええ、私は知っています。それで、私が望む値を 'UserTodoAdapter'に渡す方法を理解できないのです。 –

関連する問題