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