其中部分构想是参考其他出处(忘记出处了,抱歉) ,加上自己的一些修改.
先看一下使用的情况
public class Adapter extends BaseViewAdapter<String> {
int[] imgs = {R.mipmap.p1, R.mipmap.p2, R.mipmap.p3, R.mipmap.p4, R.mipmap.p5, R.mipmap.p6,};
public Adapter(Context mContext, List<String> mListData) {
super(mContext, R.layout.home_masonry_item, mListData);
}
public Adapter(Context mContext) {
super(mContext, R.layout.home_masonry_item);
}
@Override
protected void convert(BaseViewHolder baseViewHolder, String s, int position) {
baseViewHolder.setText(R.id.masonry_item_title, s, null);
/*图片部分设置点击事件*/
baseViewHolder.setImageResource(R.id.masonry_item_img, imgs[position % 6], new BaseViewHolder.CallBack<ImageView>() {
@Override
public void run(ImageView imageView) {
imageView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(v.getContext(), "这是点击", Toast.LENGTH_SHORT).show();
}
});
}
});
}
}
这里提供了两种构造方法,任选一种就可
适配器主体
public abstract class BaseViewAdapter<T> extends BaseAdapter {
/*数据源*/
protected List<T> mListData;
/*上下文*/
protected Context mContext;
/*布局ID*/
private int mLayoutID = -1;
/*点击事件*/
private OnClickListener mClickListener;
/*单击事件和长单击事件的屏蔽标识*/
private boolean clickFlag;
public BaseViewAdapter(Context mContext, int mLayoutID, List<T> mListData) {
this.mListData = mListData;
this.mContext = mContext;
this.mLayoutID = mLayoutID;
}
public BaseViewAdapter(Context mContext, int mLayoutID) {
this.mContext = mContext;
this.mLayoutID = mLayoutID;
}
/*设置数据源*/
public void setData(List<T> mListData) {
this.mListData = mListData;
notifyDataSetChanged();
}
/*在列表最后位置添加一条数据*/
public void addData(T t) {
if (mListData != null) {
mListData.add(t);
}
notifyDataSetChanged();
}
/*在指定位置添加一条数据*/
public void addData(int postition, T t) {
if (mListData != null) {
mListData.add(postition, t);
}
notifyDataSetChanged();
}
/*更新数据*/
public void upData(List<T> mListData) {
if (mListData != null) {
mListData.clear();
}
setData(mListData);
}
/*移除某条数据*/
public void removeData(T t) {
if (mListData != null) {
mListData.remove(t);
}
notifyDataSetChanged();
}
/*移除指定位置的数据*/
public void removeData(int position) {
if (mListData != null) {
mListData.remove(position);
}
notifyDataSetChanged();
}
@Override
public int getCount() {
return mListData == null ? 0 : mListData.size();
}
@Override
public T getItem(int position) {
return mListData == null ? null : mListData.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
View inflate = LayoutInflater.from(mContext).inflate(mLayoutID, parent, false);
BaseViewHolder viewHolder = new BaseViewHolder(inflate, mContext);
convert(viewHolder, mListData.get(position), position);
/*单击事件回调*/
inflate.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (clickFlag) {
if (mClickListener != null) {
mClickListener.OnItemClick(v, position);
}
}
clickFlag = true;
}
});
/*单击长按事件回调*/
inflate.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v) {
if (mClickListener != null) {
mClickListener.OnItemLongClick(v, position);
}
clickFlag = false;
return false;
}
});
return inflate;
}
protected abstract void convert(BaseViewHolder baseViewHolder, T t, int position);
public void setClickListener(OnClickListener mClickListener) {
this.mClickListener = mClickListener;
}
interface OnClickListener {
void OnItemClick(View view, int position);
void OnItemLongClick(View view, int position);
}
}
BaseViewHolder
这里的设置类型不全,例如:EditText 、Button等的设置
public class BaseViewHolder {
private View inflate;
private Context mContext;
public BaseViewHolder(View itemView, Context context) {
this.inflate = itemView;
this.mContext = context;
}
/*设置TextView 控件*/
public void setText(int tvID, String text, CallBack<TextView> callBack) {
TextView tx = (TextView) inflate.findViewById(tvID);
tx.setText(text);
if (callBack != null) {
callBack.run(tx);
}
}
/*设置ImageView 控件*/
public void setImageResource(int ivID, int resouceId, CallBack<ImageView> callBack) {
ImageView img = (ImageView) inflate.findViewById(ivID);
img.setImageResource(resouceId);
if (callBack != null) {
callBack.run(img);
}
}
/*设置CheckBox 控件*/
public void setCheckBox(int cbID, boolean cb, CallBack<CheckBox> callBack) {
CheckBox cbox = (CheckBox) inflate.findViewById(cbID);
cbox.setChecked(cb);
if (callBack != null) {
callBack.run(cbox);
}
}
/*设置ImageButton 控件*/
public void setImageButton(int ibtnID, CallBack<ImageButton> callBack) {
ImageButton ibtn = (ImageButton) inflate.findViewById(ibtnID);
if (callBack != null) {
callBack.run(ibtn);
}
}
/*设置LinearLayout 控件*/
public void setLinearLayout(int layoutID, CallBack<LinearLayout> callBack) {
LinearLayout layout = (LinearLayout) inflate.findViewById(layoutID);
if (callBack != null) {
callBack.run(layout);
}
}
/*设置RelativeLayout 控件*/
public void setRelativeLayout(int layoutID, CallBack<RelativeLayout> callBack) {
RelativeLayout layout = (RelativeLayout) inflate.findViewById(layoutID);
if (callBack != null) {
callBack.run(layout);
}
}
/*设置GridView 控件*/
public void setGridView(int gridID, CallBack<GridView> callBack) {
GridView grid = (GridView) inflate.findViewById(gridID);
if (callBack != null) {
callBack.run(grid);
}
}
/*回调函数*/
public interface CallBack<T> {
void run(T t);
}
}
到这里就封装完毕了,下边是demo的其他文件
home_masonry_item.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:background="#fff">
<ImageView
android:src="@mipmap/p1"
android:id="@+id/masonry_item_img"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:adjustViewBounds="true"
android:scaleType="centerCrop"/>
<TextView
android:text="文字部分"
android:id="@+id/masonry_item_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center"/>
</LinearLayout>
MainActivity.class
public class MainActivity extends AppCompatActivity {
private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView = (ListView) findViewById(R.id.list_item);
List<String> list = new ArrayList<>();
for (int i = 0; i < 10000; i++) {
list.add("第" + (i + 1) + "条数据");
}
Adapter adapter = new Adapter(this);
adapter.setData(list);
listView.setAdapter(adapter);
adapter.setClickListener(new BaseViewAdapter.OnClickListener() {
@Override
public void OnItemClick(View view, int position) {
Toast.makeText(MainActivity.this, "点击了" + (position + 1) + "条数据", Toast.LENGTH_SHORT).show();
}
@Override
public void OnItemLongClick(View view, int position) {
}
});
}
}
activity_main.xml
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.administrator.myadapter.MainActivity">
<ListView
android:id="@+id/list_item"
android:layout_width="match_parent"
android:layout_height="match_parent"></ListView>
</android.support.constraint.ConstraintLayout>