Android TabLayout 在 notifyDataSetChanged() 之后更改选项卡
Android TabLayout changes tab after notifyDataSetChanged()
我有一个带有 tabLayout 和两个选项卡的活动。在每个选项卡中,我都有一个不同的片段,其中包含由 RecyclerView 适配器管理的元素列表(RecyclerView)。对于每个列表的每个元素,我都有一个按钮可以从列表中删除该元素。
在适配器中设置了按钮的点击监听器。当我在第二个选项卡中并从列表中删除一个元素时,问题就出现了。在 notifyDatSetChanged() 之后,当前选项卡移动到第一个选项卡,我不希望这样!
这是我的代码:
这是我在 2 个不同片段中的声明和适配器集:
碎片 1
adapterList = new NotificationListAdapter(getContext(), R.layout.notification_list_element, teamsLeader, null, leadershipTeam);
list.setAdapter(adapterList);
碎片 2
adapterList = new NotificationListAdapter(getContext(), R.layout.notification_list_element, teamsMember, membershipTeam, null);
list.setAdapter(adapterList);
这是我的适配器的构造函数:
public NotificationListAdapter(Context context, int resource, List<DBTeam> notifications, ArrayList<MembershipTeam> membershipTeam, ArrayList<TeamInfo> leadershipTeam) {
this.notifications = notifications;
this.context = context;
this.resource = resource;
this.membershipTeam = membershipTeam;
this.leadershipTeam = leadershipTeam;
}
在我的 onBindViewHolder 中,我有一个针对不同视图类型的切换案例:
Mi imageView removeItem 有一个调用方法的clickListener。
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
ImageView removeItem;
LinearLayout getItemDetail;
switch (holder.getItemViewType()) {
case CHECKIN:
BaseHolder vh1 = (BaseHolder) holder;
configureViewHolder(vh1, position, context.getString(R.string.notification_checkin_title), R.drawable.notification_checkin);
removeItem = vh1.getRemoveItemImage();
getItemDetail = vh1.getDetail_layout();
removeItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
removeItem(context, notifications, position);
}
});
getItemDetail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getMemberItemDetail(context, notifications, position);
}
});
break;
AND SO ON
这是在点击侦听器中调用的 removeItem 方法:
private void removeItem(Context context, List<DBTeam> notifications, int position){
MyRepository.getInstance(context).updateNotificationDBTeamSync(notifications.get(position).getNotificationId(), true);
notifications.remove(position);
this.notifyDataSetChanged();
}
我该如何解决这个问题?
在注意到我的:
后,我解决了我的问题
MyRepository.getInstance(context).updateNotificationDBTeamSync(notifications.get(position).getNotificationId(), true);
在
private void removeItem(Context context, List<DBTeam> notifications, int position){
MyRepository.getInstance(context).updateNotificationDBTeamSync(notifications.get(position).getNotificationId(), true);
notifications.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, notifications.size());
}
正在调用我的 activity 从数据库中获取数据的方法(使用领域)。可能是因为我对领域的错误实施。
在获取数据成功时,我正在为 tabLayout 创建 viewPager 适配器实例并进行设置。所以问题是每次它创建 viewPager 适配器 e 的新实例时,默认情况下它会出现在第一个选项卡上。
我通过检查 viewPager 适配器的实例是否存在解决了这个问题:
if(pagerAdapter == null){
pagerAdapter = new NotificationPagerAdapter(getSupportFragmentManager(), getApplicationContext(), teamsLeader, teamsMember, membershipTeam, leadershipTeam);
ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager_notification);
viewPager.setAdapter(pagerAdapter);
viewPager.addOnPageChangeListener((ViewPager.OnPageChangeListener) mContext);
tabLayout = (TabLayout) findViewById(R.id.tab_layout_notification);
tabLayout.setupWithViewPager(viewPager);
changeTabsFont(0);
}
我有一个带有 tabLayout 和两个选项卡的活动。在每个选项卡中,我都有一个不同的片段,其中包含由 RecyclerView 适配器管理的元素列表(RecyclerView)。对于每个列表的每个元素,我都有一个按钮可以从列表中删除该元素。
在适配器中设置了按钮的点击监听器。当我在第二个选项卡中并从列表中删除一个元素时,问题就出现了。在 notifyDatSetChanged() 之后,当前选项卡移动到第一个选项卡,我不希望这样!
这是我的代码: 这是我在 2 个不同片段中的声明和适配器集:
碎片 1
adapterList = new NotificationListAdapter(getContext(), R.layout.notification_list_element, teamsLeader, null, leadershipTeam);
list.setAdapter(adapterList);
碎片 2
adapterList = new NotificationListAdapter(getContext(), R.layout.notification_list_element, teamsMember, membershipTeam, null);
list.setAdapter(adapterList);
这是我的适配器的构造函数:
public NotificationListAdapter(Context context, int resource, List<DBTeam> notifications, ArrayList<MembershipTeam> membershipTeam, ArrayList<TeamInfo> leadershipTeam) {
this.notifications = notifications;
this.context = context;
this.resource = resource;
this.membershipTeam = membershipTeam;
this.leadershipTeam = leadershipTeam;
}
在我的 onBindViewHolder 中,我有一个针对不同视图类型的切换案例: Mi imageView removeItem 有一个调用方法的clickListener。
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, final int position) {
ImageView removeItem;
LinearLayout getItemDetail;
switch (holder.getItemViewType()) {
case CHECKIN:
BaseHolder vh1 = (BaseHolder) holder;
configureViewHolder(vh1, position, context.getString(R.string.notification_checkin_title), R.drawable.notification_checkin);
removeItem = vh1.getRemoveItemImage();
getItemDetail = vh1.getDetail_layout();
removeItem.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
removeItem(context, notifications, position);
}
});
getItemDetail.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
getMemberItemDetail(context, notifications, position);
}
});
break;
AND SO ON
这是在点击侦听器中调用的 removeItem 方法:
private void removeItem(Context context, List<DBTeam> notifications, int position){
MyRepository.getInstance(context).updateNotificationDBTeamSync(notifications.get(position).getNotificationId(), true);
notifications.remove(position);
this.notifyDataSetChanged();
}
我该如何解决这个问题?
在注意到我的:
后,我解决了我的问题MyRepository.getInstance(context).updateNotificationDBTeamSync(notifications.get(position).getNotificationId(), true);
在
private void removeItem(Context context, List<DBTeam> notifications, int position){
MyRepository.getInstance(context).updateNotificationDBTeamSync(notifications.get(position).getNotificationId(), true);
notifications.remove(position);
notifyItemRemoved(position);
notifyItemRangeChanged(position, notifications.size());
}
正在调用我的 activity 从数据库中获取数据的方法(使用领域)。可能是因为我对领域的错误实施。 在获取数据成功时,我正在为 tabLayout 创建 viewPager 适配器实例并进行设置。所以问题是每次它创建 viewPager 适配器 e 的新实例时,默认情况下它会出现在第一个选项卡上。
我通过检查 viewPager 适配器的实例是否存在解决了这个问题:
if(pagerAdapter == null){
pagerAdapter = new NotificationPagerAdapter(getSupportFragmentManager(), getApplicationContext(), teamsLeader, teamsMember, membershipTeam, leadershipTeam);
ViewPager viewPager = (ViewPager) findViewById(R.id.view_pager_notification);
viewPager.setAdapter(pagerAdapter);
viewPager.addOnPageChangeListener((ViewPager.OnPageChangeListener) mContext);
tabLayout = (TabLayout) findViewById(R.id.tab_layout_notification);
tabLayout.setupWithViewPager(viewPager);
changeTabsFont(0);
}