仿网易新闻分类刷新
来源:互联网 发布:windows.old文件夹 编辑:程序博客网 时间:2024/05/22 11:36
最近做自己的一些小东西的时候,需要用到类似网易新闻的那种分类界面,就是上面一个tab选项卡,下面一个viewpager,可以滑动的,而且无论是滑动到哪一页,都可以下拉刷新当前页面。想了半天后,总算是实现了,以下是效果图。
效果图
效果很简单,就是一个可滑动的分类,并且每页都可以下拉刷新,并获取到对应的数据。
原理分析
界面分析
首先界面是由TabLayout+viewpager实现的,并且,viewpager的每个页面是一个fragment,根据效果图,我们可以清晰的知道viewpager每页的fragment布局都相同,所以,就可以使用一个fragment,那么,问题来了,怎么让每页显示不同的数据呢,这也是我写这篇博客的主要目的。
怎么让每页显示不同的数据
在给viewpager的设置的适配器肯定是要继承FragmentPagerAdapter的,之后需要实现2个方法,一个getItem(),一个getCount(),我们来重点看看getItem()这个方法,该方法需要返回一个fragment,假设我们的列表fragment是TypeListFragment。
@Override public Fragment getItem(int position) { //这是错误的写法 return new TypeListFragment(); }
如果按照以上方法,肯定是错的,为什么呢,因为返回的fragment是不可控的,那么就不能控制他显示什么数据。所以,这里我们需要利用一些小技巧了,首先考虑,如果按照以上写法,每次切换页面的时候,总会实例一个fragment,不行,当然不行。我们可以根据分类种类的数量知道到底需要多少个fragment,我们可以先把这些fragment放到一个仓库里,需要哪个的时候,再取哪个。
FragmentRepertory.java(fragment仓库)
public class FragmentRepertory { public static final String[] titles = {"头条", "精选", "娱乐", "热点", "体育", "科技", "时尚", "历史"}; private ArrayList<TypeListFragment> datas = new ArrayList<>(); private FragmentRepertory() { for (String title : titles) { TypeListFragment fragment = new TypeListFragment(); Bundle bundle = new Bundle(); bundle.putString("type", title); fragment.setArguments(bundle); datas.add(fragment); } } private static FragmentRepertory repertory; public static FragmentRepertory getInstance() { if (repertory == null) { repertory = new FragmentRepertory(); } return repertory; } public ArrayList<TypeListFragment> getDatas() { return datas; }}
考虑到仓库只需要一个,所以对该类做了下简单的单例处理,并且提供了获取整个仓库数据的getDatas()方法。
实现步骤
这部分代码比较多,但都比较简单,也可以直接看下面的总结,核心实现方法
1.界面实现,垂直线性布局+TabLayout+Viewpager
MainActivity.java#onCreate方法
TabLayout tablayout = (TabLayout) findViewById(R.id.tablayout); ViewPager viewpager = (ViewPager) findViewById(R.id.viewpager); tablayout.setupWithViewPager(viewpager); //设置tablayout为可滑动模式, tablayout.setTabMode(TabLayout.MODE_SCROLLABLE); MyFragmentPagerAdapter pageradapter = new MyFragmentPagerAdapter(getSupportFragmentManager()); viewpager.setAdapter(pageradapter);
MyFragmentPagerAdapter .java
public class MyFragmentPagerAdapter extends FragmentPagerAdapter { public MyFragmentPagerAdapter(FragmentManager fm) { super(fm); } @Override public Fragment getItem(int position) { return FragmentRepertory.getInstance().getDatas().get(position); } @Override public int getCount() { return FragmentRepertory.titles.length; } @Override public CharSequence getPageTitle(int position) { return FragmentRepertory.titles[position]; }}
TypeListFragment.java
该类,布局结构为RecyclerView外面嵌套SwipeRefreshLayout,然后添加5条初始信息给recyclerview。
public class TypeListFragment extends Fragment { private SwipeRefreshLayout swipeRefreshLayout; private MyAdapter adapter; private String type; private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { swipeRefreshLayout.setRefreshing(false); adapter.notifyDataSetChanged(); } }; @Nullable @Override public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) { return inflater.inflate(R.layout.fragment, container, false); } @Override public void onViewCreated(View view, @Nullable Bundle savedInstanceState) { super.onViewCreated(view, savedInstanceState); RecyclerView recyclerView = (RecyclerView) view.findViewById(R.id.recyclerview); swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.swipe); recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); adapter = new MyAdapter(getContext()); Bundle args = getArguments(); type = args.getString("type"); ArrayList<String> datas = new ArrayList<>(); for (int i = 0; i < 5; i++) { datas.add(type + " " + i); } adapter.setDatas(datas); recyclerView.setAdapter(adapter); swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { adapter.addData(type + "新增的"); adapter.addData(type + "新增的"); handler.sendEmptyMessageDelayed(1, 2000); } }); }}
MyAdapter.java(RecyclerView的适配器)
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder> { private ArrayList<String> datas = new ArrayList<>(); private LayoutInflater inflater; public MyAdapter(Context context) { inflater = LayoutInflater.from(context); } public void setDatas(ArrayList<String> datas) { this.datas = datas; } public void addData(String string) { datas.add(string); } @Override public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { return new ViewHolder(inflater.inflate(android.R.layout.simple_list_item_1, null)); } @Override public void onBindViewHolder(ViewHolder holder, int position) { holder.textView.setText(datas.get(position)); } @Override public int getItemCount() { return datas.size(); } public class ViewHolder extends RecyclerView.ViewHolder { private TextView textView; public ViewHolder(View itemView) { super(itemView); textView = (TextView) itemView.findViewById(android.R.id.text1); } }}
总结
代码部分没什么好讲的,这里总结一下,具体实现的方式:
- 需要一个仓库来存放fragment
- 要给每个fragment设置参数
for (String title : titles) { TypeListFragment fragment = new TypeListFragment(); Bundle bundle = new Bundle(); bundle.putString("type", title); fragment.setArguments(bundle); datas.add(fragment); }
获取参数:
Bundle args = getArguments(); type = args.getString("type");
根据参数的不同显示数据,顺便做个假刷新。
源码下载
- 仿网易新闻分类刷新
- Android 仿网易新闻 listView下拉刷新
- [Android] 仿网易新闻客户端分类排序
- android仿网易新闻下拉刷新上拉关闭容器
- 仿网易新闻客户端
- 仿网易新闻客户端
- 仿网易新闻框架
- 仿网易新闻客户端
- 仿网易新闻客户端
- 仿网易新闻页面效果
- 网易新闻客户端(高仿)
- 仿网易新闻的ViewpagerIndicator
- android 仿网易新闻客户端
- 新闻客户端(高仿网易)
- ios仿网易新闻客户端
- iOS 仿网易新闻框架
- iOS 仿网易新闻结构
- 仿网易聚合新闻 - 超简单实现 - 刷新按钮CSS3旋转效果
- 使用Gson处理json字符串
- 【多校训练】ZZULIOJ 1896 985的买饮料难题
- HDU1025 nlogn的LIS
- Python 爬虫5——爬取并下载网页指定规格的图片
- Linux下静态链接库与动态链接库的区别
- 仿网易新闻分类刷新
- POJ2836 状态压缩dp不能逆向推倒的
- Java ThreadPool源码简单的解析
- ANDROID 内存分析
- Activex签名方法和工具技巧(图)
- MATLAB函数句柄、单元数组和结构
- 51NOD 1016 水仙花数 V2(打表)
- kafka同步zookeeper前移偏移量
- codeforces Inna and Dima:好题,记忆化搜索,dfs