【问题标题】:Android TabLayout changes tab after notifyDataSetChanged()Android TabLayout 在 notifyDataSetChanged() 之后更改选项卡
【发布时间】:2017-06-23 23:27:57
【问题描述】:

我有一个带有 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 中,我有一个用于不同视图类型的开关盒: 小米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();
}

我该如何解决这个问题?

【问题讨论】:

  • 仅根据您提供的信息来帮助您几乎是不可能的。至少显示 RecyclerView 适配器的代码,包括点击监听器。
  • 嗨,Leo,我编辑了答案

标签: android tabs android-recyclerview adapter android-tablayout


【解决方案1】:

我注意到我的问题后解决了我的问题:

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());
}

正在调用我从数据库中获取数据的活动方法(使用领域)。可能是因为我对领域的实施不好。 在获取数据成功时,我正在为 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);
            }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 2017-02-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多