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

时间:2018-09-02 23:52:22

标签: android listview android-tablayout

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

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

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

这是listView活动

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

这是我的选项卡式活动

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中访问我选择的特定选项卡/片段,并且仍然可以从那里向前或向后滑动。

感谢Papi。

1 个答案:

答案 0 :(得分:0)

好的,首先,我将尝试回答您实际提出的问题。如果要将“选项卡式”活动打开到特定选项卡,则需要传递有关您要选择哪个选项卡的信息,然后告诉适配器进行当前选择。

您的帖子没有阐明如何您确定要选择的选项卡,因此,我假设您想要的选项卡与您单击的列表项的索引匹配。因此,如果单击列表视图中位置5处的项目,则将打开选项卡列表中索引5处的选项卡。

基于这种假设...

首先,将所需的索引传递到tabs活动:

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

然后,在“标签”活动的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
}

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

现在,我已经回答了您的问题,请允许我给您一些建议:给您的帖子,如果我不知道更好的话,我想说您目前有数百个布局文件和数百个类,每本书一本。如果是这种情况-停止。立即停止 。这是完全无法维持的。如果每个片段只代表一本不同的书,那么您只需要一个一个片段,其片段的数据将根据它代表的特定书本实例的属性进行更新。

此外,如果您有“超过200个标签”,则可能是使用了错误的UI模式。制表符通常用于少量少量的不同数据集。如果要在列表中单击摘要后查看单个书籍的书籍详细信息,则可能只想显示该书,并且仅显示该书。不是200多个其他标签。在网络上搜索“ android master detail”以获取更多信息,因为这是一种非常常见的模式。

希望有帮助!