您的位置:首页 > 其它

ListView中adapter的简单封装

2017-10-11 17:46 330 查看
一个项目中要是使用listview的场景较多的时候,会创建多个adapter和viewholder。所以将adapter和viewholde写成通用的就可以了,具体操作如下面的代码所示:


封装ViewHolder类

public class ViewHolder {
private SparseArray<View> mViews;
private View mConvertView;
private Context context;

public ViewHolder(Context context, ViewGroup parent, int layoutId, int position) {
this.context = context;
this.mViews = new SparseArray<View>();
mConvertView = LayoutInflater.from(context).inflate(layoutId, parent, false);
mConvertView.setTag(this);
}

public static ViewHolder get(Context context, View convertView, ViewGroup parent, int layoutId, int position) {
if (convertView == null) {
return new ViewHolder(context, parent, layoutId, position);
}
return (ViewHolder) convertView.getTag();
}

/**
* 通过控件id找到对应的view
*
* @param viewId
* @param <T>
* @return
*/
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 View getConvertView() {
return mConvertView;
}

/**
* 为TextView设置字符串
*
* @param viewId
* @param text
* @return
*/
public ViewHolder setText(int viewId, String text) {
TextView tv = getView(viewId);
tv.setText(text);
return this;
}

/**
* 为iamge设置网络图片
*
* @param viewId
* @param uri
* @return
*/
//compile 'com.github.bumptech.glide:glide:3.6.1'
public ViewHolder setImageByUri(int viewId, String uri) {
ImageView view = getView(viewId);
Glide.with(context).load(uri).into(view);
return this;
}

/**
* 为image设置本地图片
*
* @param viewId
* @param DrawbleId
* @return
*/
public ViewHolder setImageResource(int viewId, int DrawbleId) {
ImageView view = getView(viewId);
view.setImageResource(DrawbleId);
return this;
}

/**
* 为控件设置点击事件
*
* @param viewId
* @param listener
* @return
*/
public ViewHolder setOnClickListener(int viewId,
View.OnClickListener listener) {
View view = getView(viewId);
view.setOnClickListener(listener);
return this;
}
}


封装的listAdapter

public abstract class ListAdapter<T> extends BaseAdapter {
public Context context;
public   ArrayList<T> data;
public  LayoutInflater inflater;
public int layoutId;

public ListAdapter(Context context, ArrayList<T> data,int layoutId){
this.inflater = LayoutInflater.from(context);
this.layoutId = layoutId;
this.context = context;
this.data = data;
};

public ListAdapter(Context context, ArrayList data) {

}

@Override
public int getCount() {
return data.size();
}

@Override
public T getItem(int i) {
return data.get(i);
}

@Override
public long getItemId(int i) {
return 0;
}

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

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
final ViewHolder viewHolder = getViewHolder(i, view,
viewGroup);
convert(viewHolder, getItem(i),i);
return viewHolder.getConvertView();

}
public abstract void convert(ViewHolder helper, T item,int position);
private ViewHolder getViewHolder(int position, View convertView,
ViewGroup parent)
{
return ViewHolder.get(context, convertView, parent, layoutId,
position);
}
}


Bean类设置的参数是条目中的属性

public class Bean {

private String msg;
private String photo;

public Bean(String msg) {
this.msg = msg;
}

public Bean(String msg, String photo) {
this.msg = msg;
this.photo = photo;
}

public String getPhoto() {
return photo;
}

public void setPhoto(String photo) {
this.photo = photo;
}

public String getMsg() {
return msg;
}

public void setMsg(String msg) {
this.msg = msg;
}


activity_main.xml文件

<?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="match_parent">
<ListView
android:id="@+id/lv"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</LinearLayout>


item_list.xml文件

<?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="wrap_content"
android:gravity="center">
<TextView
android:id="@+id/tv"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_weight="1"
android:layout_gravity="center"
android:padding="10dp"/>

<ImageView
android:id="@+id/iv"
android:layout_width="50dp"
android:layout_height="50dp"
android:layout_marginRight="20dp"
android:scaleType="fitXY"/>
</LinearLayout>


MainActivity中代码的使用,由于用到了网络图片,需要在清单文件中加上

添加的依赖:compile ‘com.github.bumptech.glide:glide:3.6.1’

public class MainActivity extends AppCompatActivity {
private ArrayList<Bean> list;
private String photo = "https://ss3.bdstatic.com/70cFv8Sh_Q1YnxGkpoWK1HF6hhy/it/u=1188238263,844192284&fm=27&gp=0.jpg";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main3);
ListView lv = (ListView) findViewById(R.id.lv);
initData();
lv.setAdapter(new ListAdapter<Bean>(this, list, R.layout.item_list) {

@Override
public void convert(ViewHolder helper, Bean item, int position) {
helper.setText(R.id.tv, item.getMsg());
helper.setImageByUri(R.id.iv, item.getPhoto());
}
});
}

private void initData() {
list = new ArrayList<>();
for (int i = 0; i < 50; i++) {
list.add(new Bean("第" + i + "行的数据是" + i, photo));
}
}
}


recycleview也简单的封装了一下

ViewHolder类的封装

public class ViewHolder extends RecyclerView.ViewHolder {
private SparseArray<View> mViews;
private View mConvertView;
private Context mContext;

public ViewHolder(Context context, View itemView, ViewGroup parent) {
super(itemView);
mContext = context;
mConvertView = itemView;
mViews = new SparseArray<View>();
}

public static ViewHolder get(Context context, ViewGroup parent, int layoutId) {

View itemView = LayoutInflater.from(context).inflate(layoutId, parent,
false);
ViewHolder holder = new ViewHolder(context, itemView, parent);
return holder;
}

/**
* 通过viewId获取控件
*
* @param viewId
* @return
*/
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;
}
}


RecycleAdapter类的封装

public abstract class RecycleAdapter<T> extends Adapter {
protected Context mContext;
protected int mLayoutId;
protected List<T> mDatas;
protected LayoutInflater mInflater;

public RecycleAdapter(Context context, int layoutId, List<T> datas) {
mContext = context;
mInflater = LayoutInflater.from(context);
mLayoutId = layoutId;
mDatas = datas;
}

@Override
public ViewHolder onCreateViewHolder(final ViewGroup parent, int viewType) {
ViewHolder viewHolder = ViewHolder.get(mContext, parent, mLayoutId);
return viewHolder;
}

@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
convert((ViewHolder) holder, mDatas.get(position));
}

public abstract void convert(ViewHolder holder, T t);

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


使用场景

rcv.setLayoutManager(new LinearLayoutManager(this,LinearLayoutManager.VERTICAL,false));

rcv.setAdapter(new RecycleAdapter<Bean>(this,R.layout.item_adapter,beanList) {

@Override
public void convert(ViewHolder holder, Bean bean) {
TextView view = holder.getView(R.id.tv_msg);
view.setText(bean.getMsg());
}
});
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息