RecyclerView
安卓5.0之后的控件
可以做出listview和gridview的效果,但自定义方法会不如listview灵活
这个控件没有监听,和分割线,都需要自定义,代码内有注释说明
主界面代码
package my.qq.com.day0714android5;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.util.Log;
import android.view.View;
import java.util.ArrayList;
import java.util.List;
public class RecyclerViewActivity extends AppCompatActivity {
private RecyclerView recyclerView;
List<RecyclerViewitem> data=new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recycler_view);
recyclerView= (RecyclerView) findViewById(R.id.recyclerview);
//设置控件类型 下面这三行呈现的是listview的效果
LinearLayoutManager linearLayoutManager=new LinearLayoutManager(this);
linearLayoutManager.setOrientation(LinearLayoutManager.VERTICAL);
recyclerView.setLayoutManager(linearLayoutManager);
//给每个item添加分割线
recyclerView.addItemDecoration(new ItemDivider());
//设置控件类型 下面这两行呈现的是Gridview的效果 3是列数
// GridLayoutManager gridLayoutManager=new GridLayoutManager(this,3);
// recyclerView.setLayoutManager(gridLayoutManager);
initdata();
RecyclerViewAdapter recyclerViewAdapter=new RecyclerViewAdapter(this,data);
recyclerView.setAdapter(recyclerViewAdapter);
//给listview添加监听
recyclerViewAdapter.setItemClickListener(new RecyclerViewAdapter.OnRecyclerViewItemClickListener() {
@Override
public void OnItemClickListener(View view, int position) {
Log.i("aaa","点击的item是"+position);
}
});
}
private void initdata() {
for (int i=1;i<20;i++){
data.add(new RecyclerViewitem(R.mipmap.ic_launcher,"标题"+i));
}
}
}
适配器:
package my.qq.com.day0714android5;
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.ImageView;
import android.widget.TextView;
import java.util.List;
/**
* Created by czw on 2016/7/14 11:42.
*/
public class RecyclerViewAdapter extends RecyclerView.Adapter<RecyclerViewAdapter.RecyclerViewHolder> implements View.OnClickListener{
private Context context;
private List<RecyclerViewitem> list;
public RecyclerViewAdapter(Context context, List<RecyclerViewitem> list) {
this.context = context;
this.list = list;
}
/**
* 下面是给RecyclerView定义监听******************************************************
*
*/
//1.
private OnRecyclerViewItemClickListener listener;//接口实例
public void setItemClickListener(OnRecyclerViewItemClickListener listener){
this.listener=listener;
}
//定义一个接口 ,因为swiperefresh包下的那个类也用了这个接口,所以要用public修饰
public interface OnRecyclerViewItemClickListener{
void OnItemClickListener(View view,int position);
}
@Override
public void onClick(View view) {
if (listener!=null){
//(int)view.getTag()这个就是点击item的位置
listener.OnItemClickListener(view,(int)view.getTag());
}
}
//**********************************************************************
@Override
public RecyclerViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view=LayoutInflater.from(context).inflate(R.layout.recycler_item,null);
//****************************设置监听 2.
view.setOnClickListener(this);
RecyclerViewHolder recyclerViewHolder=new RecyclerViewHolder(view);
return recyclerViewHolder;
}
@Override
public void onBindViewHolder(RecyclerViewHolder holder, int position) {
RecyclerViewitem recyclerViewitem=list.get(position);
holder.iv.setImageResource(recyclerViewitem.getResid());
holder.tv.setText(recyclerViewitem.getTitle());
//3.设置tag,把位置传过去
holder.itemView.setTag(position);
}
@Override
public int getItemCount() {
return list.size();
}
class RecyclerViewHolder extends RecyclerView.ViewHolder{
private ImageView iv;
private TextView tv;
public RecyclerViewHolder(View itemView) {
super(itemView);
iv= (ImageView) itemView.findViewById(R.id.recycler_item_img);
tv= (TextView) itemView.findViewById(R.id.recycler_item_tv);
}
}
}
item类代码:
package my.qq.com.day0714android5;
/**
* Created by czw on 2016/7/14 11:38.
*/
public class RecyclerViewitem {
private int resid;
private String title;
public RecyclerViewitem(int resid, String title) {
this.resid = resid;
this.title = title;
}
public int getResid() {
return resid;
}
public void setResid(int resid) {
this.resid = resid;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
}
给每个item之间添加分割线的类:
package my.qq.com.day0714android5;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.graphics.Rect;
import android.support.v7.widget.RecyclerView;
import android.view.View;
/**
* Created by czw on 2016/7/14 14:39.
* 这个类是给每个item之间画一条分割线
*/
public class ItemDivider extends RecyclerView.ItemDecoration {
Paint paint;//画笔
//在绘制每个item之前执行的方法
@Override
public void onDraw(Canvas c, RecyclerView parent, RecyclerView.State state) {
//super.onDraw(c, parent, state);
//如果布局里有Padding的话可以用这个
// int left=parent.getPaddingLeft();
// int right=parent.getWidth()-parent.getPaddingRight();
//开始画的X轴和Y轴起点
int left=0;
int right=parent.getWidth();
//item个数
int itemcount=parent.getChildCount();
if (paint==null){
paint=new Paint();
paint.setColor(Color.RED);
}
if (itemcount>0){
for (int i=0;i<itemcount;i++){
//得到每个item
View itemview=parent.getChildAt(i);
//Y轴开始和结束位置都是item的高度,itemview.getBottom()
c.drawLine(left,itemview.getBottom(),right,itemview.getBottom(),paint);
}
}
}
//在绘制每个item之后执行的方法
@Override
public void onDrawOver(Canvas c, RecyclerView parent, RecyclerView.State state) {
super.onDrawOver(c, parent, state);
}
//设置偏移量
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
//super.getItemOffsets(outRect, view, parent, state);
outRect.contains(0,0,0,0);
}
}
下面是布局文件代码
主界面布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="my.qq.com.day0714android5.RecyclerViewActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview"
android:layout_width="match_parent"
android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</RelativeLayout>
item布局:
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/recycler_item_img"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@mipmap/ic_launcher"/>
<TextView
android:id="@+id/recycler_item_tv"
android:layout_toRightOf="@id/recycler_item_img"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:background="#00ff00"
android:layout_alignBottom="@id/recycler_item_img"
android:layout_alignTop="@id/recycler_item_img"
android:text="000"/>
<!-- android:layout_alignBottom="@id/recycler_item_img"
android:layout_alignTop="@id/recycler_item_img"
加这两项是为了让textview充满item,这样就不会出现只有点文字和图片时才会触发监听的情况-->
</RelativeLayout>
分割线被每个item的背景色给挡住了,加背景色是为了看一下文字和图片有没有充满整个item