Java 如何在“活动/片段”中确认警报对话框后单击时更新我的RecyclerView按钮状态?

Java 如何在“活动/片段”中确认警报对话框后单击时更新我的RecyclerView按钮状态?,java,android,broadcastreceiver,android-recyclerview,Java,Android,Broadcastreceiver,Android Recyclerview,我有一个非常独特的情况,我在一个recyclerview中有一个按钮,点击(初始状态“register”)后,它会将一个意图以片段或活动的形式传递给一个广播接收器,它会抛出一个警报对话框,有两个选项,是或否。如果选择了“否”,则不会发生任何事情,对话框会关闭,但如果单击“是”,则,它处理我在presenter类中定义的一个函数(与数据相关),并且应该将我的按钮ui状态更新为“取消”。另一方面,单击“取消”将返回警报,单击“是”将切换要注册的ui文本 现在我实现了如下代码(请注意,即使notify

我有一个非常独特的情况,我在一个recyclerview中有一个按钮,点击(初始状态“register”)后,它会将一个意图以片段或活动的形式传递给一个广播接收器,它会抛出一个警报对话框,有两个选项,是或否。如果选择了“否”,则不会发生任何事情,对话框会关闭,但如果单击“是”,则,它处理我在presenter类中定义的一个函数(与数据相关),并且应该将我的按钮ui状态更新为“取消”。另一方面,单击“取消”将返回警报,单击“是”将切换要注册的ui文本

现在我实现了如下代码(请注意,即使notifydatasetchanged对我也不起作用)。你知道我做错了什么,以及我如何做到这一点吗? my
public void onBind中的代码(int位置)
适配器中的函数:

if(repo.getIsRsvpAvailable().equals(“true”)){
rsvpButton.setVisibility(View.VISIBLE);
对于(int i=0;i{
意向输入=新意向(“单击主按钮”);
in.putExtra(“main_rsvp_event_id”,repo.getEventId());
in.putExtra(“主要的”rsvp“正在出席”,“假”);
in.putExtra(“主项目位置”,位置);
rsvpButton.getContext().sendBroadcast(在中);
});
打破
}否则{
rsvpButton.setText(“RSVP”);
rsvpButton.setOnClickListener(v->{
意向输入=新意向(“单击主按钮”);
in.putExtra(“main_rsvp_event_id”,repo.getEventId());
in.putExtra(“主要”表示“出席”,“真实”);
in.putExtra(“主项目位置”,位置);
rsvpButton.getContext().sendBroadcast(在中);
});
}
}
}
以下是我活动中广播接收器中的相应代码:

private BroadcastReceiver meventdreceiver=new BroadcastReceiver(){
@凌驾
公共void onReceive(上下文、意图){
试一试{
String eventId=intent.getStringExtra(eventId\u MAIN\u EXTRA\u TITLE);
String isAttending=intent.getStringExtra(EVENTID\u MAIN\u正在参与);
int itemPosition=intent.getIntExtra(EVENTID\u MAIN\u RSVP\u ITEM\u POSITION,0);
如果(isAttending.equals(“true”)){
showDialog(R.string.rsvp_title,R.string.confirm_rsvp_body,R.string.yes,
(对话框,其中)->{
mPresenter.onRSVPClick(eventId,isAttending);
mEventListAdapter.notifyDataSetChanged();
meventrecylerview.removeallview();
mEventRecyclerView.滚动位置(itemPosition);
},R.string.no,null,null);
}否则{
showDialog(R.string.rsvp\u title,R.string.confirm\u cancel\u body,R.string.yes,
(对话框,其中)->{
mPresenter.onRSVPClick(eventId,isAttending);
mEventListAdapter.notifyDataSetChanged();
meventrecylerview.removeallview();
mEventRecyclerView.滚动位置(itemPosition);
},R.string.no,null,null);
}
}捕获(例外e){
e、 printStackTrace();
}
}
};
请注意:mEventListAdapter是我的适配器,我正在使用中的按钮UI代码,mEventRecyclerView是我在片段中使用的回收器视图

你知道我错过了什么或做错了什么吗? 谢谢

RSVPClick方法:

@覆盖
RSVPClick上的公共void(字符串eventId,字符串isAttending){
getMvpView().showLoading();
getCompositeDisposable().add(getDataManager())
.多尔斯普瓦切普酒店(
eventId,
getDataManager().getFirstName(),
getDataManager().getLastName(),
getDataManager().getCurrentUserEmail(),
伊萨滕
)
.subscribeOn(getSchedulerProvider().io())
.observeOn(getSchedulerProvider().ui())
.订阅(响应->{
如果(!isViewAttached()){
返回;
}
getMvpView().hideLoading();
},可丢弃->{
如果(!isViewAttached()){
返回;
}
getMvpView().hideLoading();
if(错误的可丢弃实例){
ANError ANError=(ANError)可丢弃;
手跳器错误(A错误);
}
}));
}

在调用
notifyDatasetChanged()
之前,是否根据用户在对话框上选择的操作更新repo对象?
看起来
doRSVPEventApiCall()
方法不会更新适配器可用的项目列表,因此
notifyDatasetChanged()
无效。

您可以轻松维护一个数组,以指示
RecyclerView
中每个项目的按钮的状态。例如,假设每个按钮有两种状态(即RSVP=0,Cancel=1)。现在在
RecyclerView
适配器中声明一个数组,如下所示

private int[] stateArray; 
public EventListAdapter(Context context, ArrayList<Event> eventList) {
    this.eventList = eventList; 
    stateArray = new int[eventList.size];
    initializeTheStateArray(eventList);
}

private void initializeTheStateArray(ArrayList<Event> eventList) {

    // Initialize the array so that we can keep track of the items which are being attended or not. 
    for (int i = 0; i < eventList.size(); i++) {
        if(event.isAttending()) stateArray[i] = 1;
        else stateArray[i] = 0;
    }
}
if(stateArray[position] == 1) button.setText("Cancel"); // Because this item is already registerd 
else button.setText("RSVP");
public void updateEventList(ArrayList<Event> eventList) {
    this.eventList = eventList;
    stateArray = new int[eventList.size()];
    initializeTheStateArray(eventList);
}
在适配器的构造函数中,按如下方式初始化数组。让我们假设您的构造函数如下所示

private int[] stateArray; 
public EventListAdapter(Context context, ArrayList<Event> eventList) {
    this.eventList = eventList; 
    stateArray = new int[eventList.size];
    initializeTheStateArray(eventList);
}

private void initializeTheStateArray(ArrayList<Event> eventList) {

    // Initialize the array so that we can keep track of the items which are being attended or not. 
    for (int i = 0; i < eventList.size(); i++) {
        if(event.isAttending()) stateArray[i] = 1;
        else stateArray[i] = 0;
    }
}
if(stateArray[position] == 1) button.setText("Cancel"); // Because this item is already registerd 
else button.setText("RSVP");
public void updateEventList(ArrayList<Event> eventList) {
    this.eventList = eventList;
    stateArray = new int[eventList.size()];
    initializeTheStateArray(eventList);
}
您的适配器中需要一些附加功能,以便您可以更新上的
stateArray
  override fun onBindViewHolder(itemHolder: MyListViewHolder, position: Int) {
        val holder = itemHolder as MyListItemViewHolder
        val currentInfo = myList[position]

        // Get your data from list to bind here.

        holder.name.text = // Text
        holder.myDetail.text = // Text
        holder.myOtherDetail.text = Text

        holder.setOnClickListener {
             // Other stuff, state, actions etc.
             notifyItemChanged(position)
        }
    }
.subscribe(response -> {
    if (!isViewAttached()) {
        return;
    }
    Log.d("rsvptest", "basic event id:" + response);

    getMvpView().hideLoading();

}