您的位置:首页 > 移动开发 > Android开发

Android 之BaseRecyclerAdapter简单封装之路

2017-02-20 15:37 537 查看
1。使用Recyclerview代替Listview做列表数据,已经是主流了,虽然Recyclerview提供了很强大的功能,但我就得小小遗憾的是居然没有点击事件,每次都需要人为的定义接口来实现点击事件,所以讲到这里,既然封装,那就从最简单的点击事件开始吧。。。

//RecyclerView的item点击事件
public interface RvListener {
void onItemClick(int id, int position);
}


2。发现,我们每使用一个adapter的时候,就需要一个对应ViewHolder操作。。。

这一步巧妙的把RvListener放进来了

public abstract class RvHolder<T> extends RecyclerView.ViewHolder {
protected RvListener mListener;

public RvHolder(View itemView, int type, RvListener listener) {
super(itemView);
this.mListener = listener;
//这一步巧妙的把RvListener放进来了,这一步巧妙的把RvListener放进来了,这一步巧妙的把RvListener放进来了
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
mListener.onItemClick(v.getId(), getAdapterPosition());
}
});
}

public abstract void bindHolder(T t, int position);

}


3,最后就是adapter的定义

public abstract class RvAdapter<T>  extends  RecyclerView.Adapter<RvHolder>{

protected List<T> list;
protected Context mContext;
protected RvListener listener;
protected LayoutInflater mInflater;

public RvAdapter(Context context, List<T> list, RvListener listener) {
mContext = context;
mInflater = LayoutInflater.from(context);
this.list = list;
this.listener = listener;
}

@Override
public RvHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = mInflater.inflate(getLayoutId(viewType), parent, false);
return getHolder(view, viewType);
}

protected abstract int getLayoutId(int viewType);

@Override
public void onBindViewHolder(RvHolder holder, int position) {
holder.bindHolder(list.get(position), position);
}

@Override
public int getItemCount() {
return list.size();
}

@Override
public int getItemViewType(int position) {
return 0;
}

/**
*      刷新数据
* @param data
*/
public   void updata(List<T> data){
this.list=data;
notifyDataSetChanged();
}

/**
* 刷新数据
*/
public  void udaptanotify(){
list.clear();
notifyDataSetChanged();
}

protected abstract RvHolder getHolder(View view, int viewType);
}


使用:定义一个RvDemoAdapter extends RvAdapter

public class RvDemoAdapter extends RvAdapter<UserInfo> {

public RvDemoAdapter(Context context, List<UserInfo> list, RvListener listener) {
super(context, list, listener);
}

@Override
protected int getLayoutId(int viewType) {
return viewType == 0 ? R.layout.item_title : R.layout.item_content;
}

@Override
public int getItemViewType(int position) {
return list.get(position).isTitle() ? 0 : 1;
}

@Override
protected RvHolder getHolder(View view, int viewType) {
return new RvDemoHolder(view, viewType, listener);
}

class RvDemoHolder extends RvHolder<UserInfo> {

TextView title;
TextView content;

public RvDemoHolder(View itemView, int type, RvListener listener) {
super(itemView, type, listener);
switch (type) {
case 0:
title = (TextView) itemView.findViewById(R.id.title);
break;

case 1:
content = (TextView) itemView.findViewById(R.id.content);
break;
}
}

@Override
public void bindHolder(UserInfo userInfo, int position) {
int itemViewType = RvDemoAdapter.this.getItemViewType(position);
switch (itemViewType) {

case 0:

title.setText(userInfo.getName());
break;

case 1:

content.setText(userInfo.getName());

break;
}
}
}
}


两个item布局文件:

item_title.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:id="@+id/ll_title"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<TextView
android:id="@+id/title"
android:layout_width="match_parent"
android:layout_height="45dp"
android:gravity="center"
android:text="...."/>
</LinearLayout>


item_content.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:gravity="center"
android:id="@+id/ll_content"
android:layout_width="match_parent"
android:layout_height="wrap_content">

<ImageView
android:layout_width="100dp"
android:layout_height="100dp"
android:src="@mipmap/ic_launcher"/>

<TextView
android:id="@+id/content"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="....."/>

</LinearLayout>


Maintivity

public class MainActivity extends AppCompatActivity {
private RecyclerView mRecyclerView;
private List<UserInfo> datas=new ArrayList<>();
private RvDemoAdapter mRvDemoAdapter;
private GridLayoutManager mManager;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

initView();
}

private void initView() {
mRecyclerView = (RecyclerView) findViewById(R.id.RecyclerView);
initData();
}

private void initData() {

for (int i = 0; i <10 ; i++) {
UserInfo info=new UserInfo();
info.setName("title"+i);
info.setTitle(true);
datas.add(info);
for (int j = 0; j <6 ; j++) {
UserInfo infos=new UserInfo();
infos.setName("第"+i+"item"+j);
datas.add(infos);
}

}

initAdapter();
}

private void initAdapter() {
mManager=new GridLayoutManager(this,3);

mManager.setSpanSizeLookup(new GridLayoutManager.SpanSizeLookup() {
@Override
public int getSpanSize(int position) {
return datas.get(position).isTitle()? 3 :1;
}
});
mRvDemoAdapter=new RvDemoAdapter(this, datas, new RvListener() {
@Override
public void onItemClick(int id, int position) {
switch (id){
case R.id.ll_title:

Toast.makeText(MainActivity.this, datas.get(position).getName(), Toast.LENGTH_SHORT).show();

break;

case R.id.ll_content:
Toast.makeText(MainActivity.this, datas.get(position).getName(), Toast.LENGTH_SHORT).show();
break;

}
}
});

mRecyclerView.setLayoutManager(mManager);
mRecyclerView.setAdapter(mRvDemoAdapter);

}

}


一个实体类

public class UserInfo {
private String name;
private String content;
private boolean isTitle;

public String getName() {
return name;
}

public void setName(String name) {
this.name = name;
}

public String getContent() {
return content;
}

public void setContent(String content) {
this.content = content;
}

public boolean isTitle() {
return isTitle;
}

public void setTitle(boolean title) {
isTitle = title;
}
}


效果图:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android
相关文章推荐