ListView的使用

由于手機屏幕空間有限,能夠一次性展現(xiàn)在屏幕上的內(nèi)容并不多后雷,當我們需要展現(xiàn)大量數(shù)據(jù)時邻眷,就可以通過ListView來實現(xiàn)仗考。

ListView允許用戶通過手指上下滑動的方式將屏幕外的數(shù)據(jù)滾動到屏幕內(nèi)鹅巍,同時屏幕上原有的數(shù)據(jù)則會滾動出屏幕千扶。

應用場景:QQ聊天記錄 料祠、 微博消息

ListView的簡單用法

簡單實現(xiàn)ListView

創(chuàng)建一個Activity,在其視圖中添加ListView控件澎羞,并為其指定id髓绽,長寬match_parent

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

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

</LinearLayout>

然后修改Activity中的代碼:

public class MainActivity extends AppCompatActivity {

    private ListView mListview;

    private String[] data = {"item1","item2","item3","item4","item5","item6","item7","item8",
            "item9,","item10","item11","item12","item13","item14","item15"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 綁定視圖
        mListview = (ListView) findViewById(R.id.main_2a'z'zlistview);
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        mListview.setAdapter(adapter);
    }
}

效果如圖所示:

simple_listview.PNG

自定義ListView

在上一節(jié)中妆绞,我們每一行填充的View是系統(tǒng)自帶的資源android.R.layout.simple_list_item_1顺呕,我們可以按住ctrl加鼠標左鍵進入查看,內(nèi)容如下:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />

我們使用了系統(tǒng)提供的ArrayAdaper作為ListView的適配器摆碉,每行填充的視圖就是上面的TextView。然后把名為data的String類型數(shù)組依此填充進去脓豪。

關于Adapter

ListView控件是為了交互和展示數(shù)據(jù)用的巷帝,ListView也只承擔交互和展示作用,而數(shù)據(jù)來自哪里和ListView無關扫夜。所以我們要使ListView起作用楞泼,我們需要一個ListView和一個數(shù)據(jù)源

關鍵在于數(shù)據(jù)源笤闯,我們無法知道數(shù)據(jù)源是什么類型堕阔。它可能是數(shù)組,可能是對象集合颗味,還可能是數(shù)據(jù)庫表中查詢出來的游標超陆,如果ListView要為每一種數(shù)據(jù)源都進行適配操作的話,擴展性就會比較差浦马。

Adapter適配器时呀,它在ListView和數(shù)據(jù)源之間起到了一個橋梁的作用。ListView不直接和數(shù)據(jù)源打交道晶默,而是借助Adapter作為橋梁來訪問真正的數(shù)據(jù)源谨娜,

實際上我們可以自定義填充的View,我們也可以填充一個ViewGroup磺陡,例如:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <TextView
        android:id="@+id/item_roadid"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="30sp"
        android:gravity="center"/>

    <TextView
        android:id="@+id/item_redtime"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="30sp"
        android:gravity="center"/>

    <TextView
        android:id="@+id/item_greentime"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="30sp"
        android:gravity="center"/>

    <TextView
        android:id="@+id/item_yellowtime"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:textSize="30sp"
        android:gravity="center"/>

</LinearLayout>

這個ViewGroup由四個TextView組成趴梢。

在上節(jié)中我們直接使用了ArrayAdapter來作為適配器,ArrayAdapter繼承自BaseAdapter币他,默認情況下坞靶,我們可以使用它的構造方法引用單個TextView的布局作為item。但如果布局較復雜蝴悉,我們就需要加入TextView外層的布局的layout資源 滩愁,即下圖第四種用法。當TextView被引用之后辫封,將會被填充傳進來的數(shù)組對象的toString()的值硝枉。

arrayadapter.PNG

而我們需要更復雜的item廉丽,不僅僅是一個TextView,比如一個ImageView妻味,或者一個Checkbox正压,亦或是一個Button。ArrayAdapter通過getView()方法獲得每個item的View责球,所以我們需要重寫ArrayAdapter的getView()方法來返回我們自己需要的View焦履。我們通過繼承來完成重寫。

重寫ArrayAdapter

因為我們不再使用String數(shù)組作為數(shù)據(jù)源雏逾,而是以對象list的形式作為數(shù)據(jù)源嘉裤,所以我們先構建一個所需的對象。

我以交通燈為例栖博,這個對象包含roadId,redTime,greenTime,yellowTime四個屬性屑宠,然后創(chuàng)建了它的構造函數(shù)和一些getter/setter。

public class LightInfo {

    private int roadId;

    private int redTime;

    private int greenTime;

    private int yellowTime;

    public LightInfo(int roadId, int redTime, int greenTime, int yellowTime) {
        this.roadId = roadId;
        this.redTime = redTime;
        this.greenTime = greenTime;
        this.yellowTime = yellowTime;
    }

    public int getRoadId() {
        return roadId;
    }

    public void setRoadId(int roadId) {
        this.roadId = roadId;
    }

    public int getRedTime() {
        return redTime;
    }

    public void setRedTime(int redTime) {
        this.redTime = redTime;
    }

    public int getGreenTime() {
        return greenTime;
    }

    public void setGreenTime(int greenTime) {
        this.greenTime = greenTime;
    }

    public int getYellowTime() {
        return yellowTime;
    }

    public void setYellowTime(int yellowTime) {
        this.yellowTime = yellowTime;
    }
}

然后重寫適配器:

public class LightInfoAdapter extends ArrayAdapter<LightInfo> {

    private ArrayList list = new ArrayList();;

    public LightInfoAdapter(@NonNull Context context, int resource, @NonNull List<LightInfo> objects) {
        super(context, resource, objects);
    }

    @NonNull
    @Override
    public View getView(final int position, @Nullable View convertView, @NonNull ViewGroup parent) {
        View view = LayoutInflater.from(getContext()).inflate(R.layout.item_light_info, parent, false);
        LightInfo lightInfo = getItem(position);
        TextView roadId = (TextView) view.findViewById(R.id.item_roadid);
        TextView redTime = (TextView) view.findViewById(R.id.item_redtime);
        TextView greenTime = (TextView) view.findViewById(R.id.item_greentime);
        TextView yellowTime = (TextView) view.findViewById(R.id.item_yellowtime);
        roadId.setText(lightInfo.getRoadId()+"");
        redTime.setText(lightInfo.getRedTime()+"");
        greenTime.setText(lightInfo.getGreenTime()+"");
        yellowTime.setText(lightInfo.getYellowTime()+"");
        return view;
}

修改Activity中的代碼

public class MainActivity extends AppCompatActivity {

    private ListView mListview;
    // 刪除
    //private String[] data = {"item1","item2","item3","item4","item5","item6","item7","item8","item9,","item10","item11","item12","item13","item14","item15"};
    // 添加 
    private List<LightInfo> lightInfos = new ArrayList<>();;
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        // 綁定視圖
        mListview = (ListView) findViewById(R.id.main_2a'z'zlistview);
        // 刪除
        //ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        // 添加
        initData();
        LightInfoAdapter adapter = new LightInfoAdapter(this,R.layout.item_light_info,lightInfos);
        mListview.setAdapter(adapter);
    }
    // 添加死數(shù)據(jù)
    private void initData() {
        for (int i=0;i<4;i++) {
            lightInfos.add(new LightInfo(i,i,i,i));
        }
    }
}

效果如圖:

diyListView.PNG
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末仇让,一起剝皮案震驚了整個濱河市典奉,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌丧叽,老刑警劉巖卫玖,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異踊淳,居然都是意外死亡假瞬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門迂尝,熙熙樓的掌柜王于貴愁眉苦臉地迎上來笨触,“玉大人,你說我怎么就攤上這事雹舀÷樱” “怎么了?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵说榆,是天一觀的道長虚吟。 經(jīng)常有香客問我,道長签财,這世上最難降的妖魔是什么串慰? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮唱蒸,結果婚禮上邦鲫,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好庆捺,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布古今。 她就那樣靜靜地躺著,像睡著了一般滔以。 火紅的嫁衣襯著肌膚如雪捉腥。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天你画,我揣著相機與錄音抵碟,去河邊找鬼。 笑死坏匪,一個胖子當著我的面吹牛拟逮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播适滓,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼敦迄,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了粒竖?” 一聲冷哼從身側響起颅崩,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤几于,失蹤者是張志新(化名)和其女友劉穎蕊苗,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體沿彭,經(jīng)...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡朽砰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了喉刘。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片瞧柔。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖睦裳,靈堂內(nèi)的尸體忽然破棺而出造锅,到底是詐尸還是另有隱情,我是刑警寧澤廉邑,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布哥蔚,位于F島的核電站,受9級特大地震影響蛛蒙,放射性物質(zhì)發(fā)生泄漏糙箍。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一牵祟、第九天 我趴在偏房一處隱蔽的房頂上張望深夯。 院中可真熱鬧,春花似錦诺苹、人聲如沸咕晋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽捡需。三九已至办桨,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間站辉,已是汗流浹背呢撞。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留饰剥,地道東北人殊霞。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像汰蓉,于是被迫代替她去往敵國和親绷蹲。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內(nèi)容