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;
    @Override    
    protected 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());        }    }}
原创粉丝点击