我有一个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() {
}
});
}
我解决了!显然,我有一个以固定间隔运行的计时器线程,它调用一个函数来填充卡片,并根据选择的无线电按钮过滤器过滤项目。计时器每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中的元素来访问这一点,我只能通过使用此行到达它之前的点