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;
}
}
效果图:
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之家整理,本文链接:https://www.bmabk.com/index.php/post/12853.html