一、ListViewActivity
/**
* ListView+BaseAdapter
*/
public class ListViewActivity extends AppCompatActivity implements AdapterView.OnItemClickListener {
private List<DataModel> models;
private ListView mListView;
private MyBaseAdapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_list_view);
initView();
}
private void initView() {
getData();
mListView = (ListView) findViewById(R.id.list_container);
adapter = new MyBaseAdapter(this, models);
mListView.setAdapter(adapter);
mListView.setOnItemClickListener(this);
}
/**
* 构建模拟数据
*/
private void getData() {
models = new ArrayList<>();
DataModel model;
for (int i = 0; i < 20; i++) {
model = new DataModel("列表标题" + i, "说明文字" + i);
models.add(model);
}
}
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
}
}
二、MyBaseAdapter
/**
* 自定义BaseAdapter
* 包括四个成员方法和一个构造方法
*/
public class MyBaseAdapter extends BaseAdapter {
private Context context;//内部类不用传
private List<DataModel> dataModels;
private LayoutInflater mInflater;
/**
* 如果在内部实现,这两个参数都可以不用传的
* @param context
* @param dataModels
*/
public MyBaseAdapter(Context context, List<DataModel> dataModels) {
this.context = context;
this.dataModels = dataModels;
mInflater=LayoutInflater.from(context);
}
@Override
public int getCount() {
return dataModels.size();
}
@Override
public DataModel getItem(int position) {
return dataModels.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View view, ViewGroup parent) {
MyBaseViewHolder holder;
if (view==null){
view=mInflater.inflate(R.layout.item_data_model,null);
holder=new MyBaseViewHolder(context,view);
view.setTag(holder);
}else{
holder= (MyBaseViewHolder) view.getTag();
}
holder.setItem(getItem(position));
holder.refreshView();
return view;
}
}
三、
/**
* 适配BaseAdapter的ViewHolder
* 包括三个方法:一个构造方法,一个stter和一个装载数据的方法refreshView()
* Created by Devin Chen on 2016/12/17.
*/
public class MyBaseViewHolder {
private Context context;//内部类就不用,传进来是以防万一,例如Glide装在图片就要用,内部做监听也有可能要用
//装载数据的控件
private ImageView icon;
private TextView title, desc;
private DataModel item;//封装单挑数据的实体类
/**
* 构造方法:主要功能是实例化各个控件
*
* @param view 实例化的item布局文件对象
*/
public MyBaseViewHolder(Context context,View view) {
this.context=context;
icon = (ImageView) view.findViewById(R.id.img_icon);
title = (TextView) view.findViewById(R.id.txt_title);
desc = (TextView) view.findViewById(R.id.txt_desc);
}
public void setItem(DataModel item) {
this.item = item;
}
/**
* 装载数据
*/
public void refreshView(){
icon.setImageResource(R.mipmap.ic_launcher);
title.setText(item.getTitle());
desc.setText(item.getDesc());
}
}