ViewPage+Tablayout的懒加载。

开发的公司框架内加入了个新闻数据展示的页面。其实就是ViewPage+Tablayout的网络数据展示。

第一个类,即Activity(这里用的是Delegate,其实是Fragment

package com.duihao.jo3.core.delegates.news;

import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
import android.support.design.widget.TabLayout;
import android.support.v4.view.ViewPager;
import android.view.View;
import com.duihao.jo3.core.R;
import com.duihao.jo3.core.R2;
import com.duihao.jo3.core.delegates.LeftDelegate;
import java.util.ArrayList;
import butterknife.BindView;

public class NewsDelegate extends LeftDelegate {

    @BindView(R2.id.tabLayout)
    TabLayout tabLayout;
    @BindView(R2.id.viewPager)
    ViewPager viewPager;

    @Override
    public Object setLayout() {
        return R.layout.delegate_news;
    }
    ArrayList<BaseNewsFragment> fragments;
    String[] tabs = {"推荐","热点","宿迁","社会","娱乐","科技"};
    @Override
    public void onBindView(@Nullable Bundle savedInstanceState, @NonNull View rootView) {
        fragments = new ArrayList<>();
        for (int i=0;i<tabs.length;i++){
            fragments.add(BaseNewsFragment.getInstance(tabs[i]));
        }
        //设置ViewPager的适配器
        NewsViewPagerAdapeter newsViewPagerAdapeter = new NewsViewPagerAdapeter(getFragmentManager(), fragments);
        viewPager.setAdapter(newsViewPagerAdapeter);
        //关联ViewPager
        tabLayout.setupWithViewPager(viewPager);
        //设置固定的
        //tabLayout.setTabMode(TabLayout.MODE_FIXED);
        //设置滑动的。
        tabLayout.setTabMode(TabLayout.MODE_SCROLLABLE);
    }
}

第二个类,即ViewPage的适配器

package com.duihao.jo3.core.delegates.news;

import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentStatePagerAdapter;
import java.util.ArrayList;

public class NewsViewPagerAdapeter extends FragmentStatePagerAdapter {
    private final ArrayList<BaseNewsFragment> fragments;

    public NewsViewPagerAdapeter(FragmentManager fm, ArrayList<BaseNewsFragment> fragments) {
        super(fm);
        this.fragments = fragments;
    }

    /**
     * 根据位置返回对应的Fragment
     * @param position
     * @return
     */
    @Override
    public BaseNewsFragment getItem(int position) {
        return fragments.get(position);
    }

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

    /**
     * 得到页面的标题
     * @param position
     * @return
     */
    @Override
    public CharSequence getPageTitle(int position) {
        return fragments.get(position).getTitle();
    }
}

第三个类,适配器里的Fragment类

package com.duihao.jo3.core.delegates.news;

import android.os.Bundle;
import android.support.annotation.Nullable;
import android.support.v4.app.Fragment;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import com.duihao.jo3.core.R;
import com.duihao.jo3.core.net.RestClient;
import com.duihao.jo3.core.net.callback.IError;
import com.duihao.jo3.core.net.callback.IFailure;
import com.duihao.jo3.core.net.callback.ISuccess;
import com.google.gson.Gson;
import com.scwang.smartrefresh.layout.api.RefreshLayout;
import com.scwang.smartrefresh.layout.listener.OnLoadMoreListener;
import com.scwang.smartrefresh.layout.listener.OnRefreshListener;
import java.util.List;

public class BaseNewsFragment extends Fragment {
    private RecyclerView recyclerView;
    private MainRecycleViewAdapter mainRecycleViewAdapter;
    private RefreshLayout refreshLayout;
    private List<News.DataBean> dataList;
    private List<News.DataBean> newDataList;
    private int page;
    String tabTitle;

    public static BaseNewsFragment getInstance(String tabTitle) {
        BaseNewsFragment materialFragment = new BaseNewsFragment();
        Bundle bundle = new Bundle();
        bundle.putString("title", tabTitle);
        materialFragment.setArguments(bundle);
        return materialFragment;
    }

    @Override
    public void setUserVisibleHint(boolean isVisibleToUser) {
        super.setUserVisibleHint(isVisibleToUser);
        if (isVisibleToUser && isVisible()) {//视图可见并且控件准备好了,每次都会调用
            if (null == dataList) {//如果数据为空了,则需要重新联网请求
                firstLoad();
            }
        }
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        tabTitle = getArguments().getString("title");
    }

    @Nullable
    @Override
    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        return inflater.inflate(R.layout.delegate_basenew, container, false);
    }

    @Override
    public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
        refreshLayout = (RefreshLayout) view.findViewById(R.id.refreshLayout);
        recyclerView = (RecyclerView) view.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        mainRecycleViewAdapter = new MainRecycleViewAdapter(recyclerView);
        recyclerView.setLayoutManager(new LinearLayoutManager(this.getContext(), LinearLayoutManager.VERTICAL, false));
        recyclerView.setAdapter(mainRecycleViewAdapter);
        if (null == dataList && getUserVisibleHint()) {
            firstLoad();//解决第一个fragment无法加载数据问题
        }
        setOnRefreshAndLoad();
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        if (null != dataList && null != mainRecycleViewAdapter) {//解决切换后闪屏已经无数据显示问题
            mainRecycleViewAdapter.setDataList(dataList);
        }
    }

    String KEY = "z8BHWuMCoDKzfpgkCBCkncsg4kQXEkIMc4yuPn10QcJVZT48wTtgeroVT9K25EGO";
    private void firstLoad() {
        //加载首页数据
        page = 1;
        RestClient.builder()
                .loader(getContext())
                .url("http://120.76.205.241:8000/news/qihoo?kw="
                        + tabTitle + "&site=qq.com&pageToken="
                        + page + "&apikey=" + KEY)
                .success(new ISuccess() {
                    @Override
                    public void onSuccess(String responnse) {
                        dataList = parseJson(responnse);
                        mainRecycleViewAdapter.setDataList(dataList);
                    }
                }).buid().get();
    }


    private void setOnRefreshAndLoad() {
        //设置上拉下拉事件
        refreshLayout.setOnRefreshListener(new OnRefreshListener() {
            @Override
            public void onRefresh(final RefreshLayout refreshlayout) {
                page = 1;
                RestClient.builder()
                        .loader(getContext())
                        .url("http://120.76.205.241:8000/news/qihoo?kw="
                                + tabTitle + "&site=qq.com&pageToken="
                                + page + "&apikey=" + KEY)
                        .success(new ISuccess() {
                            @Override
                            public void onSuccess(String responnse) {
                                newDataList = parseJson(responnse);
                                if (newDataList != null && newDataList.size() > 0) {
                                    if (dataList != null) {
                                        dataList.clear();
                                        dataList.addAll(newDataList);
                                    } else {
                                        dataList = newDataList;
                                    }
                                    mainRecycleViewAdapter.setDataList(dataList);
                                    refreshlayout.finishRefresh(true);
                                } else {
                                    refreshlayout.finishRefresh(1000);
                                }
                            }
                        }).error(new IError() {
                    @Override
                    public void onError(int code, String msg) {
                        refreshlayout.finishLoadMore(1000);
                    }
                }).failure(new IFailure() {
                    @Override
                    public void onFailure() {
                        refreshlayout.finishLoadMore(1000);
                    }
                }).buid().get();
//                refreshlayout.finishRefresh(2000/*,false*/);//传入false表示刷新失败
            }
        });
        refreshLayout.setOnLoadMoreListener(new OnLoadMoreListener() {
            @Override
            public void onLoadMore(final RefreshLayout refreshlayout) {
                RestClient.builder()
                        .loader(getContext())
                        .url("http://120.76.205.241:8000/news/qihoo?kw="
                                + tabTitle + "&site=qq.com&pageToken="
                                + page + "&apikey=" + KEY)
                        .success(new ISuccess() {
                            @Override
                            public void onSuccess(String responnse) {
                                newDataList = parseJson(responnse);
                                if (newDataList != null && newDataList.size() > 0) {
                                    dataList.addAll(newDataList);
                                    mainRecycleViewAdapter.setDataList(dataList);
                                    refreshlayout.finishLoadMore(true);
                                } else {
                                    refreshlayout.finishLoadMore(1000);
                                }
                            }
                        }).error(new IError() {
                    @Override
                    public void onError(int code, String msg) {
                        refreshlayout.finishLoadMore(1000);
                    }
                }).failure(new IFailure() {
                    @Override
                    public void onFailure() {
                        refreshlayout.finishLoadMore(1000);
                    }
                }).buid().get();
//                refreshlayout.finishLoadMore(2000/*,false*/);//传入false表示加载失败
            }
        });
    }

    private List<News.DataBean> parseJson(String responnse) {
        News aNews = new Gson().fromJson(responnse, News.class);
        page = Integer.valueOf(aNews.getPageToken());
        return aNews.getData();
    }

    public String getTitle() {
        return tabTitle;
    }
}

最后把RecycleView的适配器也附上吧

package com.duihao.jo3.core.delegates.news;

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import com.duihao.jo3.core.R;
import java.util.ArrayList;
import java.util.List;

public class MainRecycleViewAdapter extends RecyclerView.Adapter<MainRecycleViewAdapter.RecyclerHolder> implements View.OnClickListener {

    Context mContext;
    ArrayList<News.DataBean> adapterDataList;

    public MainRecycleViewAdapter(RecyclerView recyclerView) {
        this.mContext = recyclerView.getContext();
    }

    @Override
    public RecyclerHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(mContext).inflate(R.layout.item_new, parent, false);
        view.setOnClickListener(this);
        return new RecyclerHolder(view);
    }

    @Override
    public void onBindViewHolder(RecyclerHolder holder, int position) {
        holder.tvNewTitle.setText((adapterDataList.get(position).getTitle()));
        holder.tvNewPosterScreenName.setText((adapterDataList.get(position).getPosterScreenName()));
        String strData = adapterDataList.get(position).getPublishDateStr().replace("T", "  ");
        holder.tvNewDataTime.setText(strData);
        holder.itemView.setTag(position);
    }

    @Override
    public int getItemCount() {
        if(adapterDataList!=null){
            return adapterDataList.size();
        }
        return 0;
    }

    @Override
    public void onClick(View view) {
        if (mItemClickListener!=null){
            mItemClickListener.onItemClick((Integer)view.getTag());
        }
    }

    public interface OnItemClickListener{
        void onItemClick(int position);
    }
    public void setItemClickListener(OnItemClickListener itemClickListener) {
        mItemClickListener = itemClickListener;
    }
    private OnItemClickListener mItemClickListener;

    class RecyclerHolder extends RecyclerView.ViewHolder {
        TextView tvNewTitle;
        TextView tvNewPosterScreenName;
        TextView tvNewDataTime;

        private RecyclerHolder(View itemView) {
            super(itemView);
            tvNewTitle = (TextView) itemView.findViewById(R.id.tv_new_title);
            tvNewPosterScreenName = (TextView) itemView.findViewById(R.id.tv_new_posterScreenName);
            tvNewDataTime = (TextView) itemView.findViewById(R.id.tv_new_data_time);
        }
    }

    public void setDataList(List<News.DataBean> dataList) {
        if (dataList!=null) {
            if(adapterDataList == null){
                adapterDataList = new ArrayList<>();
            }
            adapterDataList.clear();
            adapterDataList.addAll(dataList);
            notifyDataSetChanged();
        }
    }
}
PS:其中下拉刷新上拉加载用的三方框架,依赖是
compile 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-alpha-6'

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值