Android依賴注入類庫 Butter Knife的使用

我們做移動端開發,每天寫代碼時幾乎都會跟各種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

發佈了34 篇原創文章 · 獲贊 0 · 訪問量 8萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章