【问题标题】:How to save the state of button onced pressed按下后如何保存按钮的状态
【发布时间】:2019-07-25 11:44:51
【问题描述】:

我只是获取数据并将其加载到可以在adapter 上设置的recyclerView。它包含一个可以向Firebase发送数据的按钮。

当我按下按钮时,它的 color 和文本会根据要求更改 但是每当我再次重新加载它时,默认按钮状态就会被加载。

所以我希望该按钮在单击后保存其状态,并且每当我重新加载相同的活动时它应该处于保存状态。

      viewHolder.send_req.setOnClickListener(new View.OnClickListener() {
            @Override

            public void onClick(final View v) {
                final Integer taggedPosition =  viewHolder.getAdapterPosition();
                Log.d(TAG,"button click data:"+taggedPosition);


                firebaseFirestore.collection("Users").document(u_id).get().addOnCompleteListener(new OnCompleteListener<DocumentSnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<DocumentSnapshot> task) {
                        if (task.getResult().exists()){
                            name = task.getResult().getString("name");
                            userID = task.getResult().getString("user_id");

                    firebaseFirestore.collection("Pets").whereEqualTo("name",name_data).get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                    @Override
                    public void onComplete(@NonNull Task<QuerySnapshot> task) {
                        if (task.isSuccessful()){
                            for (final DocumentSnapshot documentSnapshot : task.getResult()){
                                docID = documentSnapshot.getId();
                                Log.d(TAG,"selected pet doc id:"+docID);
                                if (docID!= null){
                                   final Map<String, Object> userMap = new HashMap<>();
                                    final Map<String, Object> userMap1 = new HashMap<>();
                                    userMap.put("doc_id",docID);
                                    userMap.put("pet_id",pet_no);
                                    userMap.put("sender_id",userID);
                                    userMap.put("sender_name",name);
                                    userMap.put("pet_name",name_data);
                                    userMap.put("pet_profile",image_url);
                                    userMap.put("timestamp",FieldValue.serverTimestamp());

                                    //do not place request if data is already exist in document
                                    firebaseFirestore.collection("Send_req").get().addOnCompleteListener(new OnCompleteListener<QuerySnapshot>() {
                                        @Override
                                        public void onComplete(@NonNull Task<QuerySnapshot> task) {
                                            List<String> list = new ArrayList<>();
                                             final Button send_req = (Button)v;
                                            if (task.isSuccessful()){
                                                for (DocumentSnapshot document : task.getResult()) {
                                                    list.add(document.getString("doc_id"));
                                                    list.add(document.getString("sender_id"));
                                                }
                                                if (!(list.contains(docID)&& list.contains(userID))){
                                                    send_req.setClickable(true);
                                                    Toast.makeText(context,"send request successfully",Toast.LENGTH_SHORT).show();
                                                    send_req.setText("Cancel Request");
                                                    send_req.setBackgroundColor(Color.RED);
                                                    String btnname =send_req.getText().toString();
                                                    String button_name = (String)userMap.put("btnName",btnname);
                                                    firebaseFirestore.collection("Send_req").add(userMap);
                                                    send_req.setClickable(false);


                                                }
                                                else {

                                                    if ((list.contains(docID)&& list.contains(userID))){
                                                    if(send_req.getText().toString().equals("Send Request") )
                                                    Toast.makeText(context,"you already send request",Toast.LENGTH_SHORT).show();
                                                    send_req.setText("Cancel Request");
                                                    send_req.setBackgroundColor(Color.RED);
                                                    send_req.setClickable(false);
                                                    notifyDataSetChanged();}
                                                  }
                                            }
                                        }
                                    });


                                }
                            }
                        }

                    }
                });
            }
        }
    });
}
});

【问题讨论】:

  • 保存在shared preferences
  • Shared preferences 即使您重新启动应用程序并且需要重新设置它也会在那里。我认为最简单的方法是在一些方便的课程中使用static boolean
  • 你能根据我的代码给我建议吗?

标签: android google-cloud-firestore android-recyclerview


【解决方案1】:
public class SomeClass {

public static boolean isFeatureSelected = false;
...
}

您可以随时使用SomeClass.isFeatureSelected 调用它。

【讨论】:

    【解决方案2】:

    如果您已经有了响应的 pojo,那么您可以在 pojo 中定义一个变量并更改按钮单击该位置的值。由ChrisZ 定义。

    但如果你没有 pojo,我建议你创建一个布尔列表 sizerecyclerView item size 相同的 false 值。单击按钮后,将列表布尔值设置为该位置的 true,这样您就可以知道您已经单击了哪个位置,并使用该位置的 bool 值更改 UI。

    【讨论】:

      【解决方案3】:

      创建一个布尔变量,例如:
      boolean isClicked = false;int pos = -1;
      然后在您第一次更改按钮背景时将布尔值更改为truepos = position;

      然后在RecyclerViewonBindViewHolder 中执行以下操作:

      if(isClicked && position == pos){ // check the state of the button and the adapter position. 
          // change your background here
      }
      

      【讨论】:

        猜你喜欢
        • 2012-08-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-10-04
        • 2014-09-04
        • 1970-01-01
        相关资源
        最近更新 更多