我们做移动端开发,每天写代码时几乎都会跟各种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(); } }); }
@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>
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>
前面部分与传统的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); } } }
/** * 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