天天看點

對控件ListView的了解與使用

ListView這個控件,所有開發Android的人都會用過的吧,不過相對于RecyclerView而言,ListView我算是用的非常少的了。是以說到對ListView真正的多了解,自己卻并不是那麼熟悉,是以就重新去了解使用一番ListView,還可以配上Popupwindow + ListView + SearchView做一個組合類似的搜尋。之後的組合搜尋我之後會上傳。

先還是按照最基本的放上一個ListView的xml,以及一個ListView子項Item的xml:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.chenxuanhe.searchviewtest.MainActivity">

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

</LinearLayout>
           

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:layout_height="wrap_content"
   >
    <ImageView
        android:id="@+id/list_img"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/list_txt"
        android:layout_marginStart="10dp"
        android:layout_gravity="center_vertical"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="dadadadaadadd" />

</LinearLayout>
           

這是一個Imageview 和一個TextView最基本的搭配。

首先,一個ListView需要三樣東西:

1.資料工具類

2.擴充卡

3.ListView主代碼

1.(資料工具類)先建立一個Bean檔案

public class Bean {

    private String name;
    private int id;

    public Bean(String name ,int Id){
        this.name =name;
        this.id=Id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }
}
           

這是一個工具類,其中的Int id就是圖檔的id,也就是R.drawable.xxx這種格式,這裡需要說明一下,個人了解,有關于參數的int id部分,如果不是一個int 整形的傳參,那麼都可以了解為是傳遞一個R的id值,擴充卡的構造方法也會出現一個int id值,可以綜合了解。

當然資料這裡就自己給個資料數組

private String[] data = {"A", "B", "C", "D", "ad", "adaf", "E", "F",
            "Q", "BW", "CE", "DR", "ad", "adaf", "Ez", "FX",
            "A", "BZ", "CDD", "DFA", "ad", "adaf", "E", "F",
            "AZCZ", "BC", "CBB", "DV", "adS", "adaf", "E", "F"};
           

2.擴充卡Adapter

關于這裡的擴充卡,我有一點模仿RecyclerView的适配寫法,因為傳統的ListView的擴充卡有三種,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter,并且他們的使用方式類似

listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));

這種感覺,當然可能是個人了解問題,由于本人用多了RecyclerView是以喜歡再寫一個擴充卡,這樣搭配上Holder更加的友善。這裡我們寫一個MyAdapter類作為我們的擴充卡,讓他去繼承ArrayAdapter《Bean》于是代碼如下:

class MyAdapter extends ArrayAdapter<Bean> {

        private int ResourceId;

        public MyAdapter(Context context, int txtId, List<Bean> obj) {   // 該構造該函數的int id 就是需要R.layout.item這樣的方式
            super(context, txtId, obj);
            this.ResourceId = txtId;
        }

//這是重寫最重要的一個方法同時進行了優化
//也用到了Holder的複用,對于ListView的性能大大優化
        @Override
        public View getView(int position, View convertView, ViewGroup viewGroup) {
            Bean bean = getItem(position);
            MyHolder myHolder;
            View view;
            if (convertView == null) {
            //如果view是空,則建立新對象,一系列操作,不然就直接複用存在View中的holder對象,避免重複new對象
                view = LayoutInflater.from(getContext()).inflate(ResourceId, viewGroup, false);
                myHolder = new MyHolder();
                myHolder.txt = (TextView) view.findViewById(R.id.list_txt);
                myHolder.img = (ImageView) view.findViewById(R.id.list_img);
                view.setTag(myHolder);//将holder對象存進view
                //Tag可以了解為一個标志,可自行百度
            } else {
                view = convertView;
                myHolder = (MyHolder) view.getTag();//取出holder對象
            }
            //Holder對于view的複用,十分強大
            myHolder.txt.setText(bean.getName());
            myHolder.img.setImageResource(bean.getId());
            return view;
        }
    }

    class MyHolder {
        ImageView img;
        TextView txt;
    }
           

3.ListView的主代碼,則肯定就是在MainActivity裡面啦。首先聲明一個工具類的List,用來存放會用到的資料

private List<Bean> beanList = new ArrayList<>();

之後的代碼如下:

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        MyAdapter adapter = new MyAdapter(this, R.layout.item_view, beanList);//這裡就是開始講到的int id的用法,将item的view作為id傳給構造方法,這樣new出一個擴充卡
        ListView listView = (ListView) this.findViewById(R.id.list_view);
        listView.setAdapter(adapter);
        //這裡是用于ListView的每個子Item被點選到之後的操作
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int i, long l) {
                Bean bean = beanList.get(i);
                Toast.makeText(MainActivity.this, bean.getName(), Toast.LENGTH_SHORT).show();
            }
        });

        init();


    }

//這就是一個将開始的資料數組一次取出放入到之前聲明的list中去
//然後在new擴充卡的時候将聲明了的List放入擴充卡中就OK了
    private void init() {
        for (int i = ; i < data.length; i++) {
            String one = data[i];
            //注意看這裡就用到了Bean.class的構造方法中的int id
            //這裡的id傳入的就是R.drawable.my這樣的R值
            Bean bean = new Bean(one, R.drawable.my);
            beanList.add(bean);
        }
    }
}
           

到這裡ListView的全部介紹完了,當然,就個人意見,能用到RecyclerView的就盡量用RecyclerView(RecyclerView+CardView的效果還是很好的呦~),因為覺得畢竟一個強大的控件就可以盡量多用,當然有些效果RecyclerView就沒有ListView那樣容易實作,是以也算是多少學習ListView的用法吧。

以下是效果圖:

對控件ListView的了解與使用