一、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());
}
}