之前开发,一直使用ListView,后来使用RecyclerView,再后来下拉刷新的框架有SwipeRefreshLayout,把他和RecyclerView一起使用,感觉一直不错,但是,逻辑和代码还是比较麻烦,所以,现在开始用XRecyclerView,发现它真的是一个非常好用的框架.
首先要导入XRecyclerView,可以添加依赖,也可以直接导包,我这里有现成的包,想要的可以留言.
然后开始代码:
非常简单,包括加载轮播图,(轮播图用的也是插件 )我都有写注释
这里还包括了富文本,加载图片,以及网络请求的使用,还是比较全面的,但是界面比较简洁.
public class SubNewFragment extends android.support.v4.app.Fragment {
private static final String TAG = SubNewFragment.class.getSimpleName();
private XRecyclerView mRecyclerView;
private SubNewFragmentAdapter subNewFragmentAdapter;
private boolean isPullRefresh;
private RollPagerView mRollViewPager;
private int REQUESTCODE = 0x11;
private String nextPageToken= "";
private int catalog = 1;
private TestNormalAdapter testNormalAdapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
View view = inflater.inflate(R.layout.layout_sub_new_fragment, container, false);
sendRequest();
return view;
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mRecyclerView = (XRecyclerView) view.findViewById(R.id.xrecyclerview);
mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
//设置分割线(分割线的文件用的是万能分割线)
mRecyclerView.addItemDecoration(new RecycleViewDivider(getContext(), LinearLayoutManager.HORIZONTAL));
//设置recyclerview下拉刷新进度条的样式
mRecyclerView.setRefreshProgressStyle(ProgressStyle.LineScalePulseOut);
//设置recyclerview上拉加载更多的样式
mRecyclerView.setLoadingMoreProgressStyle(ProgressStyle.LineScalePulseOutRapid);
//添加头部
View header = LayoutInflater.from(getContext()).inflate(R.layout.header, null, false);
//轮播图的插件
mRollViewPager = (RollPagerView) header.findViewById(R.id.roll_view_pager);
//设置播放时间间隔
mRollViewPager.setPlayDelay(3000);
//设置透明度
mRollViewPager.setAnimationDurtion(500);
//设置适配器
testNormalAdapter = new TestNormalAdapter(mRollViewPager);
mRollViewPager.setAdapter(testNormalAdapter);
//设置指示器(顺序依次)
//自定义指示器图片
//设置圆点指示器颜色
//设置文字指示器
//隐藏指示器
//mRollViewPager.setHintView(new IconHintView(this, R.drawable.point_focus, R.drawable.point_normal));
mRollViewPager.setHintView(new ColorPointHintView(getContext(), Color.YELLOW, Color.WHITE));
//mRollViewPager.setHintView(new TextHintView(this));
//mRollViewPager.setHintView(null);
//支持下拉刷新
mRecyclerView.setPullRefreshEnabled(true);
//支持加载更多
mRecyclerView.setLoadingMoreEnabled(true);
//设置recyclerview下拉刷新和加载更多的监听
mRecyclerView.setLoadingListener(new XRecyclerView.LoadingListener() {
@Override
public void onRefresh() {//下拉刷新
isPullRefresh = true;
sendRequest();
}
@Override
public void onLoadMore() {//上拉加载更多
sendRequest();
}
});
mRecyclerView.addHeaderView(header);
//设置初始化状态为刷新状态。作用: 界面初始加载时,刷新数据。
mRecyclerView.refresh();
//设置适配器
subNewFragmentAdapter= new SubNewFragmentAdapter(getActivity());
mRecyclerView.setAdapter(subNewFragmentAdapter);
//设施条目的适配器
//创建并设置Adapter
subNewFragmentAdapter.setOnItemClickListener(new SubNewFragmentAdapter.OnRecyclerViewItemClickListener() {
@Override
public void onItemClick(View view, Items news) {
// Toast.makeText(getContext(), "你点击了" + news.getBody() + "条目", Toast.LENGTH_SHORT).show();
Intent intent = new Intent();
intent.putExtra("news", news.getHref());
intent.setClass(getActivity().getApplicationContext(), NewFragmentItemActivity.class);
startActivityForResult(intent, REQUESTCODE);
}
});
}
private void sendRequest() {
String url = "http://www.oschina.net/action/apiv2/news";
HttpParams params = new HttpParams();
params.put("pageToken", nextPageToken);
HttpLoader.getInstance(getContext()).get(url, params, null,0x33, new HttpLoader.HttpListener<String>() {
@Override
public void onGetResponseSuccess(int requestCode, String response) {
Gson gson = new Gson();
NewBean newBean = gson.fromJson(response, NewBean.class);
nextPageToken = newBean.getResult().getNextPageToken();
if (isPullRefresh) {
//刷新的时候清空数据
subNewFragmentAdapter.clear();
subNewFragmentAdapter.addAll(newBean.getResult().getItems());
mRecyclerView.refreshComplete();
isPullRefresh = !isPullRefresh;
sendRequestImage();
} else {
subNewFragmentAdapter.addAll(newBean.getResult().getItems());
mRecyclerView.loadMoreComplete();
}
}
@Override
public void onGetResponseError(int requestCode, VolleyError error) {
}
});
}
private void sendRequestImage() {
String url = "http://www.oschina.net/action/apiv2/banner";
HttpParams params = new HttpParams();
params.put("catalog", catalog);
HttpLoader.getInstance(getContext()).get(url, params, null, 12, new HttpLoader.HttpListener<String>() {
@Override
public void onGetResponseSuccess(int requestCode, String response) {
Gson gson = new Gson();
NewBean newBean = gson.fromJson(response, NewBean.class);
testNormalAdapter.clear();
testNormalAdapter.addAll(newBean.getResult().getItems());
//更新数据适配器应该在添加图片之后立马执行,先更新的话,会造成图片的集合为空
mRollViewPager.getViewPager().getAdapter().notifyDataSetChanged();// 更新banner图片
}
@Override
public void onGetResponseError(int requestCode, VolleyError error) {
Log.d(TAG, "onGetResponseError: " + error.getMessage());
}
});
}
private class TestNormalAdapter extends LoopPagerAdapter {
public TestNormalAdapter(RollPagerView mRollViewPager) {
super(mRollViewPager);
}
private List<Items> Items = new ArrayList<>();
public void addAll(List<Items> datas){
Items.addAll(datas);
}
public void clear(){
Items.clear();
}
@Override
public View getView(ViewGroup container, final int position) {
ImageView view = new ImageView(container.getContext());
Picasso.with(container.getContext()).load(Items.get(position).getImg()).into(view); // 加载网络图片
view.setScaleType(ImageView.ScaleType.CENTER_CROP);
view.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
view.setOnClickListener(new View.OnClickListener() { // 点击事件
@Override
public void onClick(View view) {
Intent intent = new Intent();
intent.putExtra("news", Items.get(position).getHref());
intent.setClass(getActivity().getApplicationContext(), ImageActivity.class);
startActivity(intent);
}
});
return view;
}
@Override
public int getRealCount() {
return Items.size();
}
}
}
这个是adapter
public class SubNewFragmentAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> implements View.OnClickListener {
private Activity mActivity;
private List<Items> items = new ArrayList<>();
private SubNewViewHolder subNewViewHolder;
public SubNewFragmentAdapter(Activity activity){
this.mActivity = activity;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = LayoutInflater.from(mActivity).inflate(R.layout.layout_sub_new_fragment_item, parent, false);
subNewViewHolder = new SubNewViewHolder(view);
//将创建的view进行点击事件
view.setOnClickListener(this);
return new SubNewViewHolder(view);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
subNewViewHolder = (SubNewViewHolder) holder;
// subNewViewHolder.tv_content.setText(items.get(position).getTitle());
subNewViewHolder.tv_content.setText("");
//获取文章发布的时间
String pubDate = items.get(position).getPubDate();
String time = StringUtils.friendly_time(pubDate);
subNewViewHolder.tv_time.setText(time);
subNewViewHolder.tv_time.setTextSize(10);
//获取评论的个数
String commentCount = items.get(position).getCommentCount();
boolean today = StringUtils.isToday(pubDate);
if (today){
//图片文本
showImageSpan(R.drawable.widget_today_icon);
}
//加粗文本
showBoldSpan(items.get(position).getTitle());
subNewViewHolder.tv_content1.setText(items.get(position).getBody());
subNewViewHolder.tv_author.setText("@"+items.get(position).getAuthor());
subNewViewHolder.tv_author.setTextSize(10);
subNewViewHolder.tv_comment.setText(commentCount+"");
subNewViewHolder.tv_comment.setTextSize(10);
//将数据保存在itemView的Tag中,以便点击时进行获取
subNewViewHolder.itemView.setTag(items.get(position));
}
@Override
public int getItemCount() {
return items.size();
}
public void addAll(List<Items> datas){
items.addAll(datas);
notifyItemRangeInserted(items.size() -1, getItemCount() + datas.size());
}
public void clear(){
notifyItemRangeRemoved(1, getItemCount());
}
@Override
public void onClick(View view) {
if (mOnItemClickListener != null){
//注意,这里使用getTag 的方法获取数据
mOnItemClickListener.onItemClick(view, (Items) view.getTag());
}
}
class SubNewViewHolder extends RecyclerView.ViewHolder{
private ImageView iv_image;
private TextView tv_content;
private TextView tv_content1;
private TextView tv_author;
private TextView tv_comment;
private TextView tv_time;
public SubNewViewHolder(View itemView) {
super(itemView);
iv_image = (ImageView) itemView.findViewById(R.id.iv_image);
tv_content = (TextView) itemView.findViewById(R.id.tv_content);
tv_content1 = (TextView) itemView.findViewById(R.id.tv_content1);
tv_author = (TextView) itemView.findViewById(R.id.tv_author);
tv_comment = (TextView) itemView.findViewById(R.id.tv_comment);
tv_time = (TextView) itemView.findViewById(R.id.tv_time);
}
}
public interface OnRecyclerViewItemClickListener {
void onItemClick(View view, Items items);
}
private OnRecyclerViewItemClickListener mOnItemClickListener = null;
public void setOnItemClickListener(OnRecyclerViewItemClickListener listener) {
this.mOnItemClickListener = listener;
}
/**
* 粗体
*/
private void showBoldSpan(String str) {
//spanabletring: 用于格式化文本的实现类
SpannableString spanString = new SpannableString(str);
//StyleSpan: 设置文本样式
StyleSpan span = new StyleSpan(Typeface.BOLD);
spanString.setSpan(span, 0, str.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
subNewViewHolder.tv_content.append(spanString);
}
/**
* 图片
*/
private void showImageSpan(int resId) {
SpannableString spanString = new SpannableString(" ");
Drawable d = mActivity.getResources().getDrawable(resId);
d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicHeight());
ImageSpan span = new ImageSpan(d, ImageSpan.ALIGN_BASELINE);
spanString.setSpan(span, 0, 1, Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
subNewViewHolder.tv_content.append(spanString);
}
}
最后这是一个简书上的作者写的注意事项,感觉很实用,在此转载一下
作者:Hello_Google
链接:http://www.jianshu.com/p/ed15eca82fd7
來源:简书
LayoutManager 勿使用系统自身的,下面说明其对应的关系
XLinearLayoutManager –> LinearLayoutManager
XGridLayoutManager –> GridLayoutManager
XStaggeredGridLayoutManager –> StaggeredGridLayoutManager
如果不使用 mXRecyclerView.addHeaderView() 方法,会有一个默认的下拉刷新布局
mXRecyclerView.addHeaderView(View view, int viewHeight),对应的参数分别表示为 下拉刷新头部 view 和 view 的高度(必须指定高度),这个方法会默认下拉刷新的最大距离为 2 倍的 viewHeight
mXRecyclerView.addHeaderView(View view, int viewHeight, int expandHeight),这个方法多了一个参数, expandHeight 表示下拉刷新的滑动距离,最终的滑动距离 为 expandHeight + viewHeight
如果不使用 mXRecyclerView.addFootView() 方法,则不存在加载更多操作
mXRecyclerView.addFootView(View view, int footerHeight),对应的方法参数表示为 上拉加载更多的 view 和 view 的高度(必须指定高度),这个方法默认是滑倒底部就会自动加载
mXRecyclerView.addFootView(View view, int footerHeight, boolean isManual),这个方法多了一个参数, isManual 表示是否手动上拉加载触发加载更多数据, false 表示 自动触发, true 表示 手动触发,上一个方法默认是 false
setOnRefreshListener 必须声明,否则也就达不到下拉刷新的操作了
setOnLoadMoreListener 可有可无,如果没有使用 addFootView 方法,则不用声明
mXRecyclerView.setEnableRefreshAndLoadMore(boolean) 表示是否开启下拉刷新和加载更多操作,false 表示 不开启, true 表示开启,默认是 true
mXRecyclerView.setRefresh(boolean) 表示是否开启下拉刷新,主要用于第一次加载数据时,自动触发下拉刷新操作, false 表示 第一次加载数据不会触发下拉刷新, true 表示 会下拉刷新,默认是 false
mXRecyclerView.destroyHandler() 该方法最好在 onDestroy() 中调用