如何在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
相关产品推荐
相关产品推荐

