通用的RecyclerView适配器.

来源:互联网 发布:java mvc框架有哪些 编辑:程序博客网 时间:2024/05/22 18:58

RecyclerView的功能就不多说,非常的强大,现在开发基本已经取代了ListView,但是它也有些不好的地方,比如,没有提供item的点击事件没有直接地提供addHeaderView和addFooterView,今天呢,就尝试着自己封装一个通用的RecyclerView.Adapter.使得其在实际开发中简化代码,易扩展,提高我们的开发效率,下面开始进入正题.
1,通用的ViewHolder
1,我们都知道,RecyclerView必须要使用ViewHolder模式,在我们使用的过程中,都需要去建立一个新的ViewHolder,然后作为泛型传入Adapter,那么问题来了,我们每次都要新建一个ViewHolder吗?其实是不需要的,那怎么解决这个问题呢?我们可以写一个通用的ViewHoler.
(1)首先我们确定下ViewHolder的主要的作用,实际上是通过成员变量存储对应的convertView中需要操作的字View,避免每次findViewById,从而提升运行的效率。代码如下

package com.example.mysample.common;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.text.TextUtils;import android.util.SparseArray;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.Button;import android.widget.EditText;import android.widget.FrameLayout;import android.widget.ImageView;import android.widget.LinearLayout;import android.widget.RelativeLayout;import android.widget.TextView;/** * Created by Administrator on 2016/9/27. */public class ViewHolder extends RecyclerView.ViewHolder {    private Context mContext;    public View getItemView() {        return mConvertView;    }    private View mConvertView;    private SparseArray<View> mViews;    public ViewHolder(Context context, View itemView, ViewGroup parent) {        super(itemView);        mContext = context;        mConvertView = itemView;        mViews = new SparseArray<>();    }    public ViewHolder(Context context, View itemView) {        super(itemView);        mContext = context;        mConvertView = itemView;        mViews = new SparseArray<>();    }    public static ViewHolder createViewHolder(Context context, ViewGroup parent, int layoutId){        View itemView = LayoutInflater.from(context).inflate(layoutId,parent,false);        ViewHolder holder = new ViewHolder(context,itemView,parent);        return holder;    }    public static ViewHolder createViewHolder(Context context, View itemView){        ViewHolder holder = new ViewHolder(context, itemView);        return holder;    }    public <T extends View> T getView(int viewId){       View view =  mViews.get(viewId);        if (view == null){            view = mConvertView.findViewById(viewId);            mViews.put(viewId,view);        }        return (T)view;    }    public TextView getTextView(int viewId){        TextView textView = getView(viewId);        return textView;    }    public ViewHolder setText(int viewId,String str){        if (!TextUtils.isEmpty(str)){            TextView tv  = getTextView(viewId);            tv.setText(str);        }        return this;    }    public EditText getEditView(int viewId){        EditText editText= getView(viewId);        return editText;    }    public ViewHolder setEditText(int viewId,String str){        if (!TextUtils.isEmpty(str)){            EditText tv  = getEditView(viewId);            tv.setText(str);        }        return this;    }    public ImageView getImageView(int viewId){        ImageView imageView= getView(viewId);        return imageView;    }    public Button getButton(int viewId){        Button btn= getView(viewId);        return btn;    }    public ViewHolder setButtonText(int viewId,String str){        if (!TextUtils.isEmpty(str)){            Button btn  = getButton(viewId);            btn.setText(str);        }        return this;    }    public LinearLayout getLinearLayout(int viewId){        LinearLayout layout= getView(viewId);        return layout;    }    public RelativeLayout relativeLayout(int viewId){        RelativeLayout layout= getView(viewId);        return layout;    }    public FrameLayout frameLayout(int viewId){        FrameLayout layout= getView(viewId);        return layout;    }    public ViewHolder setOnClickListener(int viewId, View.OnClickListener listener){        getView(viewId).setOnClickListener(listener);        return this;    } }

是不是很简单呢,我们的ViewHolder继承自RecyclerView.ViewHolder,内部通过SparseArray来缓存我们itemView内部的子View,从而得到一个通用的ViewHolder.
ok,有了通用的ViewHolder之后,我们的通用的Adapter分分钟就出来了。
2、通用的Adapter
具体的看代码:

package com.example.mysample.common;import android.content.Context;import android.support.v7.widget.RecyclerView;import android.view.View;import android.view.ViewGroup;import java.util.List;/** * Created by Administrator on 2016/9/27. */public abstract class CommonRecyclerAdapter<T> extends RecyclerView.Adapter<ViewHolder> {    protected Context mContext;    protected List<T> mDatas;    protected OnItemOnClickListener mOnClickListener;    protected OnItemOnLongClickListener mLongClickListener;    public void setOnItemClickListener(OnItemOnClickListener onClickListener) {        mOnClickListener = onClickListener;    }    public void setOnItemLongClickListener(OnItemOnLongClickListener longClickListener) {        mLongClickListener = longClickListener;    }    public CommonRecyclerAdapter(Context context, List<T> datas) {        mContext = context;        mDatas = datas;    }    @Override    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {        ViewHolder viewHolder =  ViewHolder.createViewHolder(mContext,parent,bindItemLayout());        return viewHolder;    }    @Override    public void onBindViewHolder(ViewHolder holder, final int position) {        T t = mDatas.get(position);        if (t != null){            convert(holder,t);        }        holder.getItemView().setOnClickListener(new View.OnClickListener() {            @Override            public void onClick(View v) {                if (mOnClickListener != null){                    mOnClickListener.onItemOnClickListener(position,v);                }            }        });        holder.getItemView().setOnLongClickListener(new View.OnLongClickListener() {            @Override            public boolean onLongClick(View v) {                if ( mLongClickListener != null){                    mLongClickListener.onItemOnLongClickListener(position,v);                }                return false;            }        });    }    public abstract void convert(ViewHolder  viewHolder ,T t);    public abstract int bindItemLayout();    @Override    public int getItemCount() {        return mDatas.size();    }}

item的点击事件和长按的点击事件,分别提供两个接口

public interface OnItemOnClickListener {    void onItemOnClickListener(int position,View itemView);}public interface OnItemOnLongClickListener {    void onItemOnLongClickListener(int position, View itemView);}

3接下来我们就可以使用了
1,新一个Uese类

package com.example.mysample;import java.io.Serializable;/** * Created by Administrator on 2016/9/27. */public class User implements Serializable {    private int id;    private String userName;    private String address;    public User(){    }    public User(int id, String userName, String address) {        this.id = id;        this.userName = userName;        this.address = address;    }    @Override    public String toString() {        return "User{" +                "id=" + id +                ", userName='" + userName + '\'' +                ", address='" + address + '\'' +                '}';    }    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUserName() {        return userName;    }    public void setUserName(String userName) {        this.userName = userName;    }    public String getAddress() {        return address;    }    public void setAddress(String address) {        this.address = address;    }}

2,新建一个MyAdapter 继承CommonRecyclerAdapter,User作为泛型传入:

package com.example.mysample;import android.content.Context;import android.view.View;import android.widget.Toast;import com.example.mysample.common.CommonRecyclerAdapter;import com.example.mysample.common.ViewHolder;import java.util.List;/** * Created by Administrator on 2016/9/27. */public class MyAdapter extends CommonRecyclerAdapter<User> {    public MyAdapter(Context context, List<User> datas) {        super(context, datas);    }    @Override    public void convert(ViewHolder viewHolder, final User user) {        viewHolder.setText(R.id.tv_address,user.getAddress());        viewHolder.setText(R.id.tv_userName,user.getUserName());        viewHolder.setOnClickListener(R.id.tv_userName, new View.OnClickListener() {            @Override            public void onClick(View v) {                Toast.makeText(mContext,user.getUserName(),Toast.LENGTH_SHORT).show();            }        });    }    /**     * 绑定item的布局     * @return     */    @Override    public int bindItemLayout() {        return R.layout.item_layout;    }}

3,在Activity中测试.

package com.example.mysample;import android.os.Bundle;import android.support.v7.app.AppCompatActivity;import android.support.v7.widget.LinearLayoutManager;import android.support.v7.widget.RecyclerView;import android.view.View;import android.widget.Toast;import com.example.mysample.common.OnItemOnClickListener;import java.util.ArrayList;import java.util.List;public class MainActivity extends AppCompatActivity {    private RecyclerView mRecyclerView;    private List<User> mList;    private MyAdapter mAdapter;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        init();    }    private void init() {        mList = new ArrayList<>();        for (int i = 0 ;i<20 ;i++){            User user = new User();            user.setAddress( i% 2==0 ? "深圳"+i:"北京"+i);            user.setUserName( i% 2==0 ? "周杰伦"+i:"昆凌"+i);            mList.add(user);        }        mAdapter = new MyAdapter(this,mList);        mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);        RecyclerView.LayoutManager layoutManager  = new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false);        mRecyclerView.setLayoutManager(layoutManager);        mRecyclerView.setAdapter(mAdapter);        mAdapter.setOnItemClickListener(new OnItemOnClickListener() {            @Override            public void onItemOnClickListener(int position, View itemView) {                Toast.makeText(MainActivity.this,mList.get(position).toString(),Toast.LENGTH_SHORT).show();            }        });    }}

那么这样的话,今天的博客就结束了谢谢大家

1 0
原创粉丝点击