You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在HorizontalCoordinatorNtbActivity中为不同书签设置不同条目文本

解决不同书签条目文本差异化的方案

要实现每个书签对应不同的列表条目文本,核心是让列表的Adapter知道当前属于哪个标签页,然后根据标签页的标识来生成对应文本。下面是具体的分步实现:

1. 修改Fragment,传递标签页索引

首先,每个书签对应一个Fragment,我们需要给Fragment传入当前标签页的索引,这样Fragment可以把这个索引传递给列表Adapter。

修改你的Fragment类(假设是RecyclerFragment):

package devlight.io.sample;

import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import androidx.annotation.NonNull;
import androidx.annotation.Nullable;
import androidx.fragment.app.Fragment;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;

public class RecyclerFragment extends Fragment {

    private int mTabIndex;

    // 静态工厂方法,传入标签页索引并返回Fragment实例
    public static RecyclerFragment newInstance(int tabIndex) {
        RecyclerFragment fragment = new RecyclerFragment();
        Bundle args = new Bundle();
        args.putInt("tab_index", tabIndex);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        // 从arguments中取出标签页索引
        if (getArguments() != null) {
            mTabIndex = getArguments().getInt("tab_index");
        }
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        final View view = inflater.inflate(R.layout.fr_recycler, container, false);
        final RecyclerView recyclerView = view.findViewById(R.id.rv);
        recyclerView.setLayoutManager(new LinearLayoutManager(getContext()));
        // 创建Adapter时传入标签页索引
        recyclerView.setAdapter(new RecyclerAdapter(mTabIndex));
        return view;
    }
}

2. 修改Adapter,根据标签索引生成差异化文本

接下来修改列表的Adapter,添加构造方法接收标签页索引,然后在onBindViewHolder中根据索引设置不同的文本:

package devlight.io.sample;

import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import androidx.annotation.NonNull;
import androidx.recyclerview.widget.RecyclerView;

public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerAdapter.ViewHolder> {

    private final int mTabIndex;
    // 可以用数组存储不同标签的文本前缀,方便后续扩展
    private final String[] mTabTextPrefixes = {
            "First Bookmark",
            "Second Bookmark",
            "Third Bookmark",
            "Fourth Bookmark",
            "Fifth Bookmark"
    };

    // 构造方法接收标签页索引
    public RecyclerAdapter(int tabIndex) {
        mTabIndex = tabIndex;
    }

    @NonNull
    @Override
    public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        final View view = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.item_recycler, parent, false);
        return new ViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull final ViewHolder holder, final int position) {
        // 根据标签索引获取对应的文本前缀,生成条目文本
        if (mTabIndex >= 0 && mTabIndex < mTabTextPrefixes.length) {
            holder.txt.setText(String.format("%s Item #%d", mTabTextPrefixes[mTabIndex], position));
        } else {
            // 兜底逻辑,防止索引越界
            holder.txt.setText(String.format("Navigation Item #%d", position));
        }
    }

    @Override
    public int getItemCount() {
        return 20; // 根据你的需求调整条目数量
    }

    static class ViewHolder extends RecyclerView.ViewHolder {
        TextView txt;

        ViewHolder(@NonNull View itemView) {
            super(itemView);
            txt = itemView.findViewById(R.id.txt);
        }
    }
}

3. 更新Activity中的ViewPager Adapter

最后,在HorizontalCoordinatorNtbActivity中,创建Fragment时传入对应的标签页索引:

package devlight.io.sample;

import android.graphics.Color;
import android.os.Bundle;
import androidx.appcompat.app.AppCompatActivity;
import androidx.fragment.app.Fragment;
import androidx.fragment.app.FragmentPagerAdapter;
import androidx.viewpager.widget.ViewPager;
import java.util.ArrayList;
import devlight.io.library.ntb.NavigationTabBar;

public class HorizontalCoordinatorNtbActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.ac_horizontal_coordinator_ntb);
        initUI();
    }

    private void initUI() {
        final ViewPager viewPager = findViewById(R.id.vp_horizontal_ntb);
        viewPager.setAdapter(new FragmentPagerAdapter(getSupportFragmentManager()) {
            @Override
            public Fragment getItem(int position) {
                // 传入当前标签页的索引给Fragment
                return RecyclerFragment.newInstance(position);
            }

            @Override
            public int getCount() {
                return 5; // 对应你的5个书签
            }

            @Override
            public CharSequence getPageTitle(int position) {
                // 这里可以设置标签页的标题,和书签对应
                switch (position) {
                    case 0: return "First";
                    case 1: return "Second";
                    case 2: return "Third";
                    case 3: return "Fourth";
                    case 4: return "Fifth";
                    default: return super.getPageTitle(position);
                }
            }
        });

        final NavigationTabBar navigationTabBar = findViewById(R.id.ntb_horizontal);
        final ArrayList<NavigationTabBar.Model> models = new ArrayList<>();
        // 初始化你的5个书签Model,和原来的代码一致
        models.add(
                new NavigationTabBar.Model.Builder(
                        getResources().getDrawable(R.drawable.ic_first),
                        Color.parseColor("#000000")
                ).title("First").build()
        );
        models.add(
                new NavigationTabBar.Model.Builder(
                        getResources().getDrawable(R.drawable.ic_second),
                        Color.parseColor("#000000")
                ).title("Second").build()
        );
        models.add(
                new NavigationTabBar.Model.Builder(
                        getResources().getDrawable(R.drawable.ic_third),
                        Color.parseColor("#000000")
                ).title("Third").build()
        );
        models.add(
                new NavigationTabBar.Model.Builder(
                        getResources().getDrawable(R.drawable.ic_fourth),
                        Color.parseColor("#000000")
                ).title("Fourth").build()
        );
        models.add(
                new NavigationTabBar.Model.Builder(
                        getResources().getDrawable(R.drawable.ic_fifth),
                        Color.parseColor("#000000")
                ).title("Fifth").build()
        );

        navigationTabBar.setModels(models);
        navigationTabBar.setViewPager(viewPager, 0);
    }
}

这样修改后,每个书签对应的列表条目就会显示带有对应书签前缀的文本了。如果后续需要新增书签,只需要在mTabTextPrefixes数组中添加新的前缀,同时调整getCount的数值即可,非常灵活。

内容的提问来源于stack exchange,提问作者Marek

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.26 09:49:42