【问题标题】:Android - Pass an intent from one activity to another that implements a callback class with FirebaseAndroid - 将意图从一个活动传递到另一个使用 Firebase 实现回调类的活动
【发布时间】:2016-07-31 08:02:39
【问题描述】:

我有两个活动:AddUserToDoToDo 实现了一个带有回调的类。 ToDo 允许用户创建待办事项列表,待办事项将立即显示在recyclerView 中。用户可以在ToDo中添加、更新或删除待办事项。

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活动中的下一步按钮后,用户数据直接添加到Firebase,用户将被重定向到ToDo页面,用户可以在该页面添加待办事项。如何传递AddUser中创建的push key,让用户添加待办事项时,会添加到用户下方?

使用意图的方式正确吗?

请不要问我为什么要让用户在创建用户后立即添加到待办事项列表。需要这种方式。

谢谢

编辑:对不起,我应该提到意图应该传递给UserTodoAdapter 类,以便在UserTodoAdapter 的Firebase 数据库引用中,我可以将引用指向从AddUser 传递的键。

我有 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"
            },
        }
    },
  }
}

【问题讨论】:

    标签: android android-intent firebase callback firebase-realtime-database


    【解决方案1】:

    通过意图传递(从AddUserToDo)很好。或者您可以将其保存到本地存储,例如 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"));
    

    【讨论】:

    • 你能建议如何将值从AddUser 传递给UserTodoAdapter吗?
    • 这不能直接完成,因为UserTodoAdapter 是在另一个活动中声明的,即ToDo,除非在 AddUser 中声明了UserTodoAdapter
    • 是的,我知道。这就是为什么我不知道如何将我想要的值传递给UserTodoAdapter
    • 您不是已经通过意图将userPushKey 传递给ToDo 活动吗?那么你可以通过调用mAdapter = new UserTodoAdapter(this, getIntent().getStringExtra("key")); 而不是mAdapter = new UserTodoAdapter(this); 来实例化UserToDoAdapter 来传递按键值。确保根据我的回答在适配器中添加构造函数。
    • 我在 Java 和 Android 时代的聊天室。你介意在那里讨论吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-05-31
    • 1970-01-01
    • 2021-03-15
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多