我們做移動端開發,每天寫代碼時幾乎都會跟各種View打交道,大量的聲明和findViewById()讓人感到厭煩,但是又不得不寫,今天給大家推薦一個第三方開源注解工具,ButterKnife,大家可自行在網上下載下傳使用.下面先通過兩段代碼了解對比一下傳統寫法和使用了ButterKnife後代碼的變化.
傳統寫法:
private ListView listview;
public void initView(){
listview=(ListView)this.findViewById(R.id.listview);
listview.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Toast.makeText(getBaseContext(), "item"+position, Toast.LENGTH_SHORT).show();
}
});
}
使用ButterKnife後的代碼:
@InjectView(R.id.listview)
ListView mListview;
@OnItemClick(R.id.listview)
public void onItemClick(int position){
Toast.makeText(getBaseContext(), "item"+position, Toast.LENGTH_SHORT).show();
}
是不是省了不少代碼呢?
注解工具的作用就是簡化代碼.減少意義不大的工作的工作量,進而讓開發者省去時間專注到重要代碼的開發.
ButterKnife就是一款出色的注解工具,今天我們重點講一下ButterKnife在ListView的ViewHolder中的應用.
第一步:配置ButterKnife.
ButterKnife下載下傳完成後copy到工程的libs下.
低版本的api需要右擊工程-->build path-->add to build path;
重要步驟:右擊目前項目,選擇最後一項Properties.點選Java Compiler-->Annotation Processing将下圖所示選框打鈎
點選Apply-->Ok按鈕.
繼續點選Annotation Processing下的Factory Path:
如下圖所示勾選選框并添加ButterKnife的jar包:
到這一步,ButterKnife配置成功,下面開始使用ButterKnife:
首先在activity_main.xml添加一個ListView:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent" >
<ListView
android:id="@+id/listview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
然後建立一個LiatView的Item布局檔案item.xml:
TextView用于顯示清單内容 同時在右側給每個Item添加一個按鈕 用來觀察item點選事件
在此我們使用了
android:descendantFocusability="blocksDescendants"
這一屬性,是為了防止item中添加按鈕後隻有按鈕響應點選事件而item不響應點選事件.
大家可以把這條屬性去掉,測試一下,加深大家的了解和記憶.
<?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="50dp"
android:descendantFocusability="blocksDescendants"
android:orientation="horizontal" >
<TextView
android:layout_weight="1"
android:id="@+id/tv_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:gravity="center_vertical"/>
<Button
android:layout_gravity="center_vertical"
android:id="@+id/btn_msg"
android:layout_width="100dp"
android:layout_height="40dp"
android:text="點選"
android:textSize="10sp"/>
</LinearLayout>
我們先給ListView建立一個自定義Adapter,繼承BaseAdapter
前面部分與傳統的Adapter沒差別,隻有ViewHolder類寫法不同,大家看代碼很容易了解,就是将傳統的findViewById()換成了@InjectView注解
public class MyAdapter extends BaseAdapter{
private Context context;
private ArrayList<String> datas;
/**
* 構造方法
*/
public MyAdapter(Context context,ArrayList<String> datas){
this.context=context;
this.datas=datas;
}
@Override
public int getCount() {
return datas.size();
}
@Override
public Object getItem(int position) {
return datas.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder mHolder=null;
if (convertView==null) {
convertView=View.inflate(context, R.layout.item, null);
mHolder=new ViewHolder(convertView);
convertView.setTag(mHolder);
}else {
mHolder=(ViewHolder) convertView.getTag();
}
final String data=datas.get(position);
mHolder.tv_content.setText(data);
mHolder.btn_msg.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
Toast.makeText(context, data, Toast.LENGTH_SHORT).show();
}
});
return convertView;
}
static class ViewHolder{
@InjectView(R.id.tv_content)
TextView tv_content;
@InjectView(R.id.btn_msg)
TextView btn_msg;
public ViewHolder(View v) {
ButterKnife.inject(this,v);
}
}
}
在MainActivity.class中添加如下代碼:
/**
* ButterKnife注解實作ListView顯示資料
* @author Grrsun
*
*/
public class MainActivity extends Activity {
//注解 省去了findViewById() 代碼更加簡潔
@InjectView(R.id.listview)
ListView mListview;
//ArrayList存數清單資料
private ArrayList<String> datas;
//ListView擴充卡
private MyAdapter mAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//注冊butterknife
ButterKnife.inject(this);
//初始化View
initView();
}
/**
* 初始化View
*/
private void initView() {
//執行個體化ArrayLi
datas=new ArrayList<String>();
//擷取資料
for (int i = 0; i <30; i++) {
datas.add("click"+i);
}
//執行個體化Adapter
mAdapter=new MyAdapter(this, datas);
mListview.setAdapter(mAdapter);
}
/**
* ListView的item點選事件
* @param position
*/
@OnItemClick(R.id.listview)
public void onItemClick(int position){
Toast.makeText(getBaseContext(), "item"+position, Toast.LENGTH_SHORT).show();
}
}
運作後,如下圖所示:
點選Item:
點選按鈕:
歡迎關注微網誌,互相交流技術!http://weibo.com/momo91