如何从 listView Activity 导航到特定的选项卡式片段 activity

How to navigate from listView Activity to specific tabbed fragment activity

我是 Android 编程新手,我需要你的帮助。请。我想做什么。

我创建了列表视图,从我创建的 OnItemClickListener 列表视图到 TabbedActivity。

现在我希望每个 listView 项目在 TabbedActivity 上显示不同的片段。

这是列表视图activity

public class BookListActivity extends AppCompatActivity {

    android.support.v7.widget.Toolbar toolbar;
    ListView listView;

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

        toolbar = (android.support.v7.widget.Toolbar) findViewById(R.id.toolbar);
        toolbar.setTitle("Best Selling Books by Author");
        listView = (ListView) findViewById(R.id.listView);

        ArrayAdapter<String> mAdapter = new ArrayAdapter<String>(SongListActivity.this,
                android.R.layout.simple_list_item_1,
                getResources().getStringArray(R.array.bookList));

        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {

Intent intent = new Intent(ListViewActivity.this, TabbedActivity.class);
intent.putExtra("BookList", listView.getItemAtPosition(i).toString());
startActivity(intent);
            }
        });


        listView.setAdapter(mAdapter);
    }
}

这是我的标签Activity

public class TabbedActivity extends AppCompatActivity {

    private static final String TAG = "HymnActivity";

    private SectionsPageAdapter mSectionsPageAdapter;

    private ViewPager mViewPager;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_hymn);
        Log.d(TAG, "onCreate: Starting");

        mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

        mViewPager = (ViewPager) findViewById(R.id.container);
        setupViewPager(mViewPager);

//        Bundle bundle = getIntent().getExtras();
//        if(bundle != null) {
////           HOW SHOULD I IMPLEMENT THIS
//        }

    }

    private void setupViewPager(ViewPager viewPager) {
        SectionsPageAdapter adapter = new SectionsPageAdapter(getSupportFragmentManager());
        adapter.addFragment(new Book1(), "Book1");
        adapter.addFragment(new Book2(), "Book2");
        adapter.addFragment(new Book3(), "Book3");
        adapter.addFragment(new Book4(), "Book4");
        adapter.addFragment(new Book5(), "Book5");
        adapter.addFragment(new Book6(), "Book6");
        adapter.addFragment(new Book7(), "Book7");
        adapter.addFragment(new Book8(), "Book8");
        adapter.addFragment(new Book9(), "Book9");
        adapter.addFragment(new Book10(), "Book10");

        viewPager.setAdapter(adapter);
    }


}

这是我的 SectionsPagerAdapter

public class SectionsPageAdapter extends FragmentPagerAdapter {

    private final List<Fragment> mFragmentList = new ArrayList<>();
    private final List<String> mFragmentTitleList = new ArrayList<>();


    public void addFragment(Fragment fragment, String title) {
        mFragmentList.add(fragment);
        mFragmentTitleList.add(title);
    }


    public SectionsPageAdapter(FragmentManager fm) {

        super(fm);
    }

    @Nullable
    @Override
    public CharSequence getPageTitle(int position) {
        return mFragmentTitleList.get(position);
    }

    @Override
    public Fragment getItem(int position) {
        return mFragmentList.get(position);
    }

    @Override
    public int getCount() {
        return mFragmentList.size();
    }
}

这是我的一个片段

public class Book274 extends Fragment {
    private static final String TAG = "Book274";

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container,
            @Nullable Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.book274, container, false);

        return view;
    }
}

到目前为止,当我滑过它们时,选项卡式片段效果很好。但是我不能转到特定的幻灯片。它总是从头开始,我有 200 多个标签

这就是我要实现 listView 选项卡的原因。这样我就可以从 listView 访问我选择的特定 tab/fragment,并且仍然可以从那里向前或向后滑动。

谢谢爸爸

好的,首先,我将尝试回答您实际提出的问题。如果你想打开 "tabbed" activity 到一个特定的标签,你需要传递关于你想要 select 哪个标签的信息,然后告诉适配器使它成为当前 select离子.

您的post没有阐明您如何确定您想要select哪个选项卡,所以我假设您想要该选项卡与您单击的列表项的索引相匹配。因此,如果您单击列表视图中位置 5 的项目,您将打开选项卡列表中索引 5 处的选项卡。

有了这个假设...

首先,将所需的索引传递给选项卡 activity:

listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
    @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
        Intent intent = new Intent(ListViewActivity.this, TabbedActivity.class);
        intent.putExtra("SelectedTabIndex", i); // <- Send tab index through the intent here
        startActivity(intent);
    }
});

然后,在 "tabs" activity 的 onCreate 中,您拉取该索引并告诉适配器去那里:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_hymn);
    Log.d(TAG, "onCreate: Starting");

    mSectionsPageAdapter = new SectionsPageAdapter(getSupportFragmentManager());

    mViewPager = (ViewPager) findViewById(R.id.container);
    setupViewPager(mViewPager);

    int index = getIntent().getIntExtra("SelectedTabIndex", 0)
    mViewPager.setCurrentItem(index); // <- BOOM
}

这应该足以让您继续前进。如果您要转到哪个选项卡的逻辑与单击的索引不同,您应该仍然可以使用相同的基本思想。

现在我已经回答了你的问题,请允许我给你一些不请自来的建议:鉴于你的 post,如果我不知道更好的话,我会说你目前有 数百个布局文件和数百个类,每本书一个。如果是这样的话——停止。立即停止。这是完全无法维护的。如果每个片段只代表一本不同的书,那么您只需要 一个 个片段,其数据根据它所代表的特定书籍实例的属性进行更新。

此外,如果您有 "over 200 tabs",您可能使用了错误的 UI 模式。选项卡通常用于 数量的不同数据集。如果您想在列表中单击某本书的摘要后查看该书的详细信息,您可能只想显示那本书 并且只显示那本书 。不是 200 多个其他选项卡。在网络上搜索 "android master detail" 以获取更多信息,因为这是一种非常常见的模式。

希望对您有所帮助!