开发的公司框架内加入了个新闻数据展示的页面。其实就是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'