Recyclerview的简单应用
来源:互联网 发布:虹光扫描仪软件 编辑:程序博客网 时间:2024/06/06 00:52
Main.xml布局,最外面嵌套一个LinearLayout布局
<RelativeLayout android:layout_width="match_parent" android:layout_height="40dp" android:background="#ff3660"> <ImageView android:id="@+id/iv" android:layout_width="wrap_content" android:layout_height="wrap_content" android:background="@mipmap/ic_launcher" /> <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_centerVertical="true" android:layout_marginLeft="5dp" android:layout_toRightOf="@id/iv" android:text="百度热歌榜" /></RelativeLayout><LinearLayout android:layout_width="match_parent" android:layout_height="200dp" android:gravity="center_vertical" android:padding="10dp" android:orientation="horizontal"> <ImageView android:id="@+id/iv_banner" android:layout_width="150dp" android:layout_height="150dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:paddingLeft="20dp"> <TextView android:id="@+id/tvTitle" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/tvTime" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="7dp"/> <TextView android:id="@+id/tvContent" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="7dp"/> </LinearLayout></LinearLayout><android.support.v4.widget.SwipeRefreshLayout android:id="@+id/srl" android:layout_width="match_parent" android:layout_height="match_parent"><android.support.v7.widget.RecyclerView android:id="@+id/rv" android:layout_width="match_parent" android:layout_height="match_parent"/></android.support.v4.widget.SwipeRefreshLayout>
item布局
<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="80dp" android:gravity="center_vertical" android:layout_margin="10dp" android:orientation="horizontal"> <ImageView android:id="@+id/iv" android:layout_width="90dp" android:layout_height="90dp" /> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:paddingLeft="20dp" android:orientation="vertical"> <TextView android:id="@+id/top" android:layout_width="wrap_content" android:layout_height="wrap_content" /> <TextView android:id="@+id/button" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginTop="7dp"/> </LinearLayout></LinearLayout>//HttpUtil网络解析工具类
public class HttpUtil { private static HttpUtil httpUtil; private final OkHttpClient client; private HttpUtil() { client = new OkHttpClient.Builder() //拦截器 .addInterceptor(new LoggingInterceptor()) //超时操作 .connectTimeout(5, TimeUnit.SECONDS) .readTimeout(5, TimeUnit.SECONDS) .writeTimeout(5, TimeUnit.SECONDS) .build(); } //build单例模式 public static HttpUtil getHttpUtil() { if (httpUtil == null) { synchronized (HttpUtil.class) { if (httpUtil == null) { httpUtil = new HttpUtil(); } } } return httpUtil; } public void doPost(String url, Map<String, String> params, Callback callback) { FormBody.Builder builder = new FormBody.Builder(); for (Map.Entry<String, String> entry : params.entrySet()) { builder.add(entry.getKey(), entry.getValue()); } FormBody formBody = builder.build(); Request request = new Request.Builder().url(url).post(formBody).build(); client.newCall(request).enqueue(callback); } public void doGet(String url, Callback callback) { Request request = new Request.Builder().url(url).build(); client.newCall(request).enqueue(callback); }}OnNetListener判断成功失败接口
public interface OnNetListener<T> { public void onSuccess(T t); public void onFailure(Exception e);}Model层-musicModel
public class MusicModel implements IMusicModel { private Handler handler = new Handler(Looper.getMainLooper()); @Override public void getMusic(String offset, final OnNetListener<MusicBean> onNetListener) { String url = String.format(Api.url, offset); HttpUtil.getHttpUtil().doGet(url, new Callback() { @Override public void onFailure(Call call, final IOException e) { handler.post(new Runnable() { @Override public void run() { onNetListener.onFailure(e); } }); } @Override public void onResponse(Call call, Response response) throws IOException { String string = response.body().string(); final MusicBean musicBean = new Gson().fromJson(string, MusicBean.class); handler.post(new Runnable() { @Override public void run() { onNetListener.onSuccess(musicBean); } }); } }); }}IMusicModel接口
public interface IMusicModel { public void getMusic(String offset, OnNetListener<MusicBean> onNetListener);}Presenter类p层
public class MusicPresenter { private MusicModel musicModel; private IMainActivity iMainActivity; public MusicPresenter(IMainActivity iMainActivity) { this.iMainActivity = iMainActivity; musicModel = new MusicModel(); } public void getMusic(String offset){ musicModel.getMusic(offset, new OnNetListener<MusicBean>() { @Override public void onSuccess(MusicBean musicBean) { iMainActivity.showBannerlv(musicBean.getBillboard().getPic_s640()); iMainActivity.showRv(musicBean.getSong_list()); iMainActivity.setTime(musicBean.getBillboard().getUpdate_date()+""); iMainActivity.setTitle(musicBean.getBillboard().getName()+""); iMainActivity.setContext(musicBean.getBillboard().getComment()+""); } @Override public void onFailure(Exception e) { } }); }}MainActivity View层
public class MainActivity extends AppCompatActivity implements IMainActivity { private ImageView mIv; private ImageView mIvBanner; private TextView mTvTitle; private TextView mTvTime; private TextView mTvContent; private RecyclerView mRv; private MusicPresenter musicPresenter; private int offset; private GoogleApiClient client;private SwipeRefreshLayout mSrl;@Overrideprotected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
initView();musicPresenter = new MusicPresenter(this);musicPresenter.getMusic(offset + "");mRv.setLayoutManager(new LinearLayoutManager(this));client = new GoogleApiClient.Builder(this).addApi(AppIndex.API).build();}private void initView() {
mIv = (ImageView) findViewById(R.id.iv);mIvBanner = (ImageView) findViewById(R.id.iv_banner);mTvTitle = (TextView) findViewById(R.id.tvTitle);mTvTime = (TextView) findViewById(R.id.tvTime);mTvContent = (TextView) findViewById(R.id.tvContent);mRv = (RecyclerView) findViewById(R.id.rv);mSrl = (SwipeRefreshLayout) findViewById(R.id.srl);}@Override
public void showBannerlv(String imgUrl) {ImageLoader.getInstance().displayImage(imgUrl, mIvBanner);}@Override
public void showRv(List<MusicBean.SongListBean> list) {MyAdapter myAdapter = new MyAdapter(this, list);mRv.setAdapter(myAdapter);
myAdapter.setOnItemListener(new MyAdapter.OnItemListener() { @Override public void onItemClick(String str) { Toast.makeText(MainActivity.this, "点击:" + str, Toast.LENGTH_SHORT).show(); } @Override public void onItemLongClick(String str) { Toast.makeText(MainActivity.this, "长按" + str, Toast.LENGTH_SHORT).show(); }});//给SwipeRefreshLayout设置下拉监听mSrl.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { @Override public void onRefresh() { //模拟耗时操作 new Handler().postDelayed(new Runnable() { @Override public void run() { //停止刷新 mSrl.setRefreshing(false); Toast.makeText(MainActivity.this, "刷新成功", Toast.LENGTH_SHORT).show(); } }, 3000); }});/*mRv.setOnScrollListener(new RecyclerView.OnScrollListener() { @Override public void onScrollStateChanged(RecyclerView recyclerView, int newState) { if (newState == RecyclerView.SCROLL_STATE_IDLE) { LinearLayoutManager lm = (LinearLayoutManager) mRv.getLayoutManager(); if (lm.findLastVisibleItemPosition() == list.size() - 1) { List<String> moreList = new ArrayList<String>(); for (int i = 0; i < 10; i++) { moreList.add("新添加的数据" + i); } myAdapter.addMore(moreList); } } } @Override public void onScrolled(RecyclerView recyclerView, int dx, int dy) { super.onScrolled(recyclerView, dx, dy); }});*/}@Override
public void setTitle(String title) {mTvTitle.setText(title);
}@Override
public void setTime(String times) {mTvTime.setText(times);
}@Override
public void setContext(String context) {mTvContent.setText(context);
}}IMainActivity接口
public interface IMainActivity { public void showBannerlv(String imgUrl); public void showRv(List<MusicBean.SongListBean> list); public void setTitle(String title); public void setTime(String time); public void setContext(String context);}RecyclerView.Adapter-RecyclerView适配器
public class MyAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {//2、定义一个属性private OnItemListener onItemListener;/** * 1、定义一个接口 */public interface OnItemListener { public void onItemClick(String str); public void onItemLongClick(String str);}//3、定义一个方法public void setOnItemListener(OnItemListener onItemListener) { this.onItemListener = onItemListener;}private Context context;private List<MusicBean.SongListBean> list;public MyAdapter(Context context, List<MusicBean.SongListBean> list) {
this.context = context;this.list = list;}@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {View view = LayoutInflater.from(context).inflate(R.layout.item, parent, false);return new MyViewHolder(view);
}@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {MusicBean.SongListBean listBean = list.get(position);
MyViewHolder myViewHolder = (MyViewHolder) holder;ImageLoader.getInstance().displayImage(listBean.getPic_big(),myViewHolder.iv);myViewHolder.tv.setText(listBean.getAuthor());
myViewHolder.but.setText(listBean.getSi_proxycompany());
}@Override
public int getItemCount() {return list.size();}class MyViewHolder extends RecyclerView.ViewHolder{private ImageView iv;private TextView tv;private TextView but;public MyViewHolder(View itemView) {
super(itemView);
iv = (ImageView) itemView.findViewById(R.id.iv);tv = (TextView) itemView.findViewById(R.id.top);but = (TextView) itemView.findViewById(R.id.button);}}/** * 添加更多的方法 * * @param moreList */public void addMore(List<MusicBean.SongListBean> moreList) { list.addAll(moreList); notifyDataSetChanged();}}DividerGridItemDecoration
import android.content.Context;import android.content.res.TypedArray;import android.graphics.Canvas;import android.graphics.Rect;import android.graphics.drawable.Drawable;import android.support.v7.widget.GridLayoutManager;import android.support.v7.widget.RecyclerView;import android.support.v7.widget.RecyclerView.LayoutManager;import android.support.v7.widget.RecyclerView.State;import android.support.v7.widget.StaggeredGridLayoutManager;import android.view.View;/** * * @author zhy * */public class DividerGridItemDecoration extends RecyclerView.ItemDecoration{ private static final int[] ATTRS = new int[] { android.R.attr.listDivider }; private Drawable mDivider; public DividerGridItemDecoration(Context context) { final TypedArray a = context.obtainStyledAttributes(ATTRS); mDivider = a.getDrawable(0); a.recycle(); } @Override public void onDraw(Canvas c, RecyclerView parent, State state) { drawHorizontal(c, parent); drawVertical(c, parent); } private int getSpanCount(RecyclerView parent) { // 列数 int spanCount = -1; LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { spanCount = ((GridLayoutManager) layoutManager).getSpanCount(); } else if (layoutManager instanceof StaggeredGridLayoutManager) { spanCount = ((StaggeredGridLayoutManager) layoutManager) .getSpanCount(); } return spanCount; } public void drawHorizontal(Canvas c, RecyclerView parent) { int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int left = child.getLeft() - params.leftMargin; final int right = child.getRight() + params.rightMargin + mDivider.getIntrinsicWidth(); final int top = child.getBottom() + params.bottomMargin; final int bottom = top + mDivider.getIntrinsicHeight(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } public void drawVertical(Canvas c, RecyclerView parent) { final int childCount = parent.getChildCount(); for (int i = 0; i < childCount; i++) { final View child = parent.getChildAt(i); final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child .getLayoutParams(); final int top = child.getTop() - params.topMargin; final int bottom = child.getBottom() + params.bottomMargin; final int left = child.getRight() + params.rightMargin; final int right = left + mDivider.getIntrinsicWidth(); mDivider.setBounds(left, top, right, bottom); mDivider.draw(c); } } private boolean isLastColum(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { if ((pos + 1) % spanCount == 0){// 如果是最后一列,则不需要绘制右边 return true; } } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); if (orientation == StaggeredGridLayoutManager.VERTICAL) { if ((pos + 1) % spanCount == 0){// 如果是最后一列,则不需要绘制右边 return true; } } else { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一列,则不需要绘制右边 return true; } } return false; } private boolean isLastRaw(RecyclerView parent, int pos, int spanCount, int childCount) { LayoutManager layoutManager = parent.getLayoutManager(); if (layoutManager instanceof GridLayoutManager) { childCount = childCount - childCount % spanCount; if (pos >= childCount)// 如果是最后一行,则不需要绘制底部 return true; } else if (layoutManager instanceof StaggeredGridLayoutManager) { int orientation = ((StaggeredGridLayoutManager) layoutManager) .getOrientation(); // StaggeredGridLayoutManager 且纵向滚动 if (orientation == StaggeredGridLayoutManager.VERTICAL) { childCount = childCount - childCount % spanCount; // 如果是最后一行,则不需要绘制底部 if (pos >= childCount) return true; } else{// StaggeredGridLayoutManager 且横向滚动 // 如果是最后一行,则不需要绘制底部 if ((pos + 1) % spanCount == 0) { return true; } } } return false; } @Override public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) { int spanCount = getSpanCount(parent); int childCount = parent.getAdapter().getItemCount(); if (isLastRaw(parent, itemPosition, spanCount, childCount)){// 如果是最后一行,则不需要绘制底部 outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0); } else if (isLastColum(parent, itemPosition, spanCount, childCount)){// 如果是最后一列,则不需要绘制右边 outRect.set(0, 0, 0, mDivider.getIntrinsicHeight()); } else { outRect.set(0, 0, mDivider.getIntrinsicWidth(),mDivider.getIntrinsicHeight()); } }}
阅读全文
0 0
- recyclerview的简单应用
- Recyclerview的简单应用
- recyclerview的适配器简单应用
- RecyclerView的简单应用2,仿gridview
- RecyclerView的简单应用3:瀑布流
- 关于RecyclerView的简单应用教程
- RecyclerView的瀑布流简单应用
- RecyclerView的瀑布流简单应用
- 安卓RecyclerView与DrawerLayout的简单应用
- Android UI控件之RecyclerView的简单应用
- 第一篇博客,简单介绍RecyclerView的应用
- android复习路之RecyclerView简单的应用
- RecyclerView局部刷新的应用场景简单分析
- RecyclerView的其他应用
- recyclerview的应用分析
- RecyclerView的多部局应用
- Android recyclerView的应用
- RecyclerView的简单使用
- 测鬼记(中)之奋斗——同是天涯沦落人
- Java Map 按key排序和按Value排序
- 阿里云ECS搭建FTP出现的问题
- C 命令行参数
- Struts2学习---简单的数据校验、访问Web元素
- Recyclerview的简单应用
- Activiti工作流引擎使用
- 测鬼记(中)之奋斗——BUG挖掘机
- 十进制、二进制换转
- 相对定位和绝对定位
- 测鬼记(中)之奋斗——乡聚
- Java Map集合利用比较器Comparator根据Key和Value的排序
- C# 调用jave中ajax的WebService引用后添加HTTP Header的问题
- ActionContext详解