仿网易新闻分类刷新

来源:互联网 发布: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);        }    }}

总结

代码部分没什么好讲的,这里总结一下,具体实现的方式:

  1. 需要一个仓库来存放fragment
  2. 要给每个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");

根据参数的不同显示数据,顺便做个假刷新。

源码下载

0 0
原创粉丝点击