Android ButterKnife详解以及结合ListView的使用

ButterKnife是一个专注于Android系统的View注入框架,以前总是要写很多findViewById来找到View对象,有了ButterKnife可以很轻松的省去这些步骤,而且使用ButterKnife对性能基本没有损失,因为ButterKnife用到的注解并不是在运行时反射的,而是在编译的时候生成新的class。项目集成起来也是特别方便,使用起来也是特别简单
话不多说,先简单说一下怎么配置ButterKnife
现在项目的build.gradle里面导入环境
在这里插入图片描述
然后在app里面的build.gradle-dependencies导入这两行(可以更高版本)

    implementation 'com.jakewharton:butterknife:8.0.1'
    annotationProcessor 'com.jakewharton:butterknife-compiler:8.0.1'

之后sync一下就可以使用ButterKnife了

使用ButterKnife很简单,可以不用去findViewById了
在这里插入图片描述
要注意的是:使用了ButterKnife之后,控件前面不能使用private,否则会报错;
然后记得在onCreate的时候去绑定一下,这样就搞定了
如果想设置点击事件的话

//添加注解
    @OnClick({R.id.btn_1})
    public void OnClick(View view){
        switch (view.getId ()){
            case R.id.btn_1:
                mButton_1.setText ("Button1");
                mButton_2.setText ("Button");
                mTextView.setText ("ButterKnife");
                    break;
        }
    }

然后运行,搞定;
接下来看看怎么结合ListView来使用
首先结合ListView的话我们先创建一个子item
category_item.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:orientation="vertical"
    android:layout_height="56dp">
<TextView
    android:id="@+id/id_title"
    android:gravity="center_vertical"
    android:layout_width="match_parent"
    android:layout_height="wrap_content" />
</LinearLayout>

创建一个新的CategoryActivity

package com.example.butter_knife;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.widget.ListView;
import android.widget.Toast;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;
import butterknife.OnClick;
import butterknife.OnItemClick;

public class Category extends AppCompatActivity {

    //注入ListView
    @BindView (R.id.listt_View)
    ListView listView;
    //初始化数据
    private List<String> mData = new ArrayList<> (Arrays.asList ("Simple use" , "ListView"));

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate (savedInstanceState);
        setContentView (R.layout.activity_categroy);
        ButterKnife.bind (this);
        //设置适配器
        listView.setAdapter (new CategoryAdapter (this,mData));
    }
    @OnItemClick(R.id.listt_View)
    public void itemClicked(int position){
    //土司
        Toast.makeText (this,"position: " + position,Toast.LENGTH_SHORT).show ();
    }
}

布局文件就一个ListView
ListView有了,那我们就需要一个适配器
Adapter的话我们还是用ViewHolder来做缓存

package com.example.butter_knife;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;

import java.util.List;

import butterknife.BindView;
import butterknife.ButterKnife;

public class CategoryAdapter extends ArrayAdapter<String> {
    private LayoutInflater inflater;
    public CategoryAdapter(Context context, List<String> objects){
        super (context,-1,objects);
        inflater = LayoutInflater.from (context);
    }

    @Override
    public View getView(int position,View convertView,ViewGroup parent) {
        ViewHolder viewHolder = null;
        if (convertView == null){
            convertView = inflater.inflate (R.layout.categroy_item,parent,false);
            viewHolder = new ViewHolder (convertView);
            convertView.setTag (viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag ();
        }
        viewHolder.mTextView.setText (getItem (position));
            return convertView;
    }
    static class ViewHolder{
    //注入textView
        @BindView (R.id.id_title)
    TextView mTextView;
   
    public ViewHolder(View view){
    //因为ViewHolder没有findViewById这个方法,所以只传入this是不可以的
    //这个view就相当于是convertView 
        ButterKnife.bind (this,view);
    }
}
}

运行程序,搞定
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值