当前位置: 首页 > 知识库问答 >
问题:

RecyclerView项目中的按钮有时不会注册点击

姚和顺
2023-03-14

我有一个RecyclerView列表,其中显示了一个包含一些文本视图和按钮的项目。我已经将每个项目的按钮链接到特定功能。碎片看起来像这样。

这两个按钮(红色和蓝色)根据用户的状态更改其功能。e、 g.当用户未被批准时,蓝色按钮将显示“激活帐户”,红色按钮将显示“删除请求”,每个按钮都有自己的功能。按钮的所有功能都按预期工作,但有一个小问题。当我点击这两个按钮中的一个时,它有时不会注册点击。我认为这可能与RecyclerView的滚动属性有关。有没有办法克服这个问题?我希望这些按钮能像普通按钮一样工作,当触摸按钮时,它将始终注册为按钮点击,而不是循环视图拖动。

RecyclerView适配器:

class AccountViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

    TextView text_name;
    TextView text_username;
    TextView text_status1; // Approved | Pending
    TextView text_status2; // Admin
    TextView text_status3; // Operator
    Button button_left; // Deactivate | Remove Request
    Button button_right; // Admin | Activate
    private WeakReference<AccountListClickListener> listenerRef;

    public AccountViewHolder(@NonNull View itemView, AccountListClickListener clickListener) {
        super(itemView);
        listenerRef = new WeakReference<>(clickListener);

        text_name = itemView.findViewById(R.id.acc_name);
        text_username = itemView.findViewById(R.id.acc_username);
        text_status1 = itemView.findViewById(R.id.acc_status);
        text_status2 = itemView.findViewById(R.id.acc_status2);
        text_status3 = itemView.findViewById(R.id.acc_status3);
        button_left = itemView.findViewById(R.id.button_left);
        button_right = itemView.findViewById(R.id.button_right);

        button_left.setOnClickListener(this);
        button_right.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {

        if (view.getId() == button_left.getId())
            listenerRef.get().leftButtonClick(getAdapterPosition(), button_left.getText().toString(), text_username.getText().toString().substring(10));

        if (view.getId() == button_right.getId())
            listenerRef.get().rightButtonClick(getAdapterPosition(), button_right.getText().toString(), text_username.getText().toString().substring(10));

    }

}

public void setFilter(int i){
    this.statusFilter = i;
}

}

回收视图片段

public class AccountFragment extends Fragment implements RadioGroup.OnCheckedChangeListener {

private RecyclerView recyclerView;
private List<Account> accountList;
private AccountAdapter accountAdapter;
private Timer timer;
private View view;
private boolean isActive;
private RadioGroup rg1, rg2;
private int filter;

@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    isActive = true;
    return inflater.inflate(R.layout.fragment_account, container, false);
}

@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    this.view = view;

    accountList = new ArrayList<>();

    rg1 = view.findViewById(R.id.fg_acc1);
    rg2 = view.findViewById(R.id.fg_acc2);

    rg1.setOnCheckedChangeListener(this);
    rg2.setOnCheckedChangeListener(this);

    timer = new Timer();
    timer.scheduleAtFixedRate(new TimerTask() {

        @Override
        public void run() {
            getActivity().runOnUiThread(new Runnable() {
                @Override
                public void run() {
                    if(isActive) {
                        ((MainActivity) getActivity()).populateAccountCards();
                    }
                }
            });
        }

    }, 0, 100);

    final DatabaseReference ref = FirebaseDatabase.getInstance().getReference().child("account");
    ref.addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(@NonNull DataSnapshot snapshot) {
            for (DataSnapshot snap : snapshot.getChildren()){
                accountList.add(snap.getValue(Account.class));
            }
            accountAdapter = new AccountAdapter(view.getContext(), accountList, new AccountAdapter.AccountListClickListener() {
                @Override
                public void leftButtonClick(int i, String button, String username) {
                    switch(button){
                        case "DEACTIVATE ACCOUNT":
                            modifyAccount(ref, 0, username);
                            break;
                        case "REMOVE REQUEST":
                            modifyAccount(ref, 1, username);
                            break;
                    }
                }

                @Override
                public void rightButtonClick(int i, String button, String username) {
                    switch(button){
                        case "REMOVE AS ADMIN":
                            modifyAccount(ref, 2, username);
                            break;
                        case "MAKE ADMIN":
                            modifyAccount(ref, 3, username);
                            break;
                        case "ACTIVATE ACCOUNT":
                            modifyAccount(ref, 4, username);
                            break;
                    }
                }
            });

            recyclerView = view.findViewById(R.id.recyclerView2);
            recyclerView.setHasFixedSize(true);
            recyclerView.setLayoutManager(new LinearLayoutManager(view.getContext()));



            recyclerView.setAdapter(accountAdapter);
        }

        @Override
        public void onCancelled(@NonNull DatabaseError error) {

        }
    });
}

public AccountAdapter getAccountAdapter(){
    return this.accountAdapter;
}

/*
0 - Deactivate Account
1 - Remove Account
2 - Remove as Admin
3 - Make Admin
4 - Activate Account
 */
private void modifyAccount(DatabaseReference ref, final int i, final String user) {
    final Fragment currentFragment = getActivity().getSupportFragmentManager().findFragmentById(R.id.fragment_container);
    final FragmentTransaction fragmentTransaction = getFragmentManager().beginTransaction();
    DatabaseUtil.readDataByUsername(user, ref, new OnGetDataListener() {
        @Override
        public void dataRetrieved(final DataSnapshot dataSnapshot) {
            switch(i){
                case 0:
                    DialogInterface.OnClickListener dialogClickListener1 = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which){
                                case DialogInterface.BUTTON_POSITIVE:
                                    dataSnapshot.getRef().child("activated").setValue(false);
                                    dataSnapshot.getRef().child("admin").setValue(false);
                                    fragmentTransaction.detach(currentFragment);
                                    fragmentTransaction.attach(currentFragment);
                                    fragmentTransaction.commit();
                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    Toast.makeText(getContext(), "Action Cancelled", Toast.LENGTH_LONG).show();
                                    break;
                            }
                        }
                    };
                    AlertDialog.Builder builder1 = new AlertDialog.Builder(getContext());
                    builder1.setMessage("Deactivate Account of " + user + "?").setPositiveButton("Yes", dialogClickListener1)
                            .setNegativeButton("No", dialogClickListener1).show();
                    break;
                case 1:
                    DialogInterface.OnClickListener dialogClickListener2 = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which){
                                case DialogInterface.BUTTON_POSITIVE:
                                    dataSnapshot.getRef().removeValue();
                                    fragmentTransaction.detach(currentFragment);
                                    fragmentTransaction.attach(currentFragment);
                                    fragmentTransaction.commit();
                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    Toast.makeText(getContext(), "Action Cancelled", Toast.LENGTH_LONG).show();
                                    break;
                            }
                        }
                    };
                    AlertDialog.Builder builder2 = new AlertDialog.Builder(getContext());
                    builder2.setMessage("Delete Account of " + user + "?\nWARNING: ALL DATA WILL BE LOST").setPositiveButton("Yes", dialogClickListener2)
                            .setNegativeButton("No", dialogClickListener2).show();
                    break;
                case 2:
                    DialogInterface.OnClickListener dialogClickListener3 = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which){
                                case DialogInterface.BUTTON_POSITIVE:
                                    dataSnapshot.getRef().child("admin").setValue(false);
                                    fragmentTransaction.detach(currentFragment);
                                    fragmentTransaction.attach(currentFragment);
                                    fragmentTransaction.commit();
                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    Toast.makeText(getContext(), "Action Cancelled", Toast.LENGTH_LONG).show();
                                    break;
                            }
                        }
                    };
                    AlertDialog.Builder builder3 = new AlertDialog.Builder(getContext());
                    builder3.setMessage("Remove Admin Access of " + user + "?").setPositiveButton("Yes", dialogClickListener3)
                            .setNegativeButton("No", dialogClickListener3).show();
                    break;
                case 3:
                    DialogInterface.OnClickListener dialogClickListener4 = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which){
                                case DialogInterface.BUTTON_POSITIVE:
                                    dataSnapshot.getRef().child("admin").setValue(true);
                                    fragmentTransaction.detach(currentFragment);
                                    fragmentTransaction.attach(currentFragment);
                                    fragmentTransaction.commit();
                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    Toast.makeText(getContext(), "Action Cancelled", Toast.LENGTH_LONG).show();
                                    break;
                            }
                        }
                    };
                    AlertDialog.Builder builder4 = new AlertDialog.Builder(getContext());
                    builder4.setMessage("Grant Admin Access to " + user + "?").setPositiveButton("Yes", dialogClickListener4)
                            .setNegativeButton("No", dialogClickListener4).show();
                    break;
                case 4:
                    DialogInterface.OnClickListener dialogClickListener5 = new DialogInterface.OnClickListener() {
                        @Override
                        public void onClick(DialogInterface dialog, int which) {
                            switch (which){
                                case DialogInterface.BUTTON_POSITIVE:
                                    dataSnapshot.getRef().child("activated").setValue(true);
                                    fragmentTransaction.detach(currentFragment);
                                    fragmentTransaction.attach(currentFragment);
                                    fragmentTransaction.commit();
                                    break;

                                case DialogInterface.BUTTON_NEGATIVE:
                                    Toast.makeText(getContext(), "Action Cancelled", Toast.LENGTH_LONG).show();
                                    break;
                            }
                        }
                    };
                    AlertDialog.Builder builder5 = new AlertDialog.Builder(getContext());
                    builder5.setMessage("Activate Account of " + user + "?").setPositiveButton("Yes", dialogClickListener5)
                            .setNegativeButton("No", dialogClickListener5).show();
                    break;

            }
        }

        @Override
        public void dataExists(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onStart() {

        }

        @Override
        public void onFailure() {

        }
    });

}

共有1个答案

赵飞雨
2023-03-14

我解决了!显然,我有一个以固定间隔运行的计时器线程,它调用一个函数来填充卡片,并根据选择的无线电按钮过滤器过滤项目。计时器每100毫秒执行一次该函数来更新项目适配器,这没有给系统足够的时间来注册按钮按下。将计时器间隔更改为更长的持续时间解决了问题。

这是有意义的,因为当我触摸按钮超过100毫秒时,系统将不再识别我触摸了原始按钮,因为它已经填充了一组新的视图,最终,我触摸的按钮现在不见了,还有它的点击功能。

 类似资料:
  • 单击Delete按钮时,应用程序崩溃。 2020-03-01 22:50:55.461 168 00-16800/com.solutions.rsaggarwal E/AndroidRuntime:致命异常:主进程:com.solutions.rsaggarwal,PID:16800 java.lang.NullPointerException:尝试在com.solutions.rsaggarwa

  • 我有两个s类型的。对于每个都有一个相应的,里面有一个。 我希望单击按钮会产生与单击标签相同的效果:检查相应的输入。 然而,这并没有发生。如下面的代码段所示,悬停并按下按钮确实会触发单选按钮中相应的样式更改,但单击操作不会选择输入,即使简单标签按预期工作。 我已经检查了s是s的合法子代。标签允许短语化内容,按钮是短语化内容,所以那里应该一切正常。 我还尝试将事件侦听器添加到两个按钮的单击事件中,并在

  • 在react-native中,我有一个TextInput元素,当您单击它时,键盘会按需要弹出。然而,问题是,我有一个箭头按钮,当您将输入输入到TextInput中时,您可以单击该按钮,但第一次触摸该按钮或其他任何地方时,总是只删除键盘,而不会在箭头按钮上运行onPress功能。我如何使它,当我输入了我的文本,并仍然有键盘向上。下一次按下既可以移除键盘,又可以在按钮上执行onPress功能。现在用户

  • 为了显示数据,我创建了,其中包含。我想实现样式的刷列表元素来显示操作按钮。我的方法允许我在向项滑动后显示图标: 我想使此图标以便使用中被点击位置的对象的发送请求(在alertview确认后) 有可能吗?我试图将替换为但未成功

  • 每当我单击登录页面中的“注册”按钮时,应用程序就会崩溃,无法移动到下一个活动。我已经在这个问题上纠缠了一天,似乎在任何地方都找不到解决办法。 下面是我为注册按钮方法编写的代码。(和是文本输入布局) Logcat在第7行显示错误,即ref.child(…行)。我尝试了第7行的替代方法,如:

  • 我想通过单击cardView中的元素来访问这一点,我只能通过使用此行到达它之前的点