ListView

手機(jī)屏幕空間有限携兵,能顯示的內(nèi)容不多蕾哟。可以借助ListView來顯示更多的內(nèi)容共缕。
ListView允許用戶通過上下滑動來將屏幕外的數(shù)據(jù)滾動到屏幕內(nèi)洗出,同時屏幕內(nèi)原有的數(shù)據(jù)滾動出屏幕,從而顯示更多的數(shù)據(jù)內(nèi)容图谷。

ListView的簡單用法

修改activity_main.xml

<LinearLayout 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"
    android:orientation="vertical"
    tools:context=".MainActivity">
    <ListView
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:id="@+id/listview"></ListView>
</LinearLayout>

android:layout_widthandroid:layout_height設(shè)置為match_parent可以把ListView占滿整個布局的空間翩活。

修改MainActivity.java

public class MainActivity extends AppCompatActivity {

    private String [] data = {"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry",
    "Mango","Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry",
            "Mango"};

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        //ArraryAdapter適配器,通過泛型來指定要適配的數(shù)據(jù)類型便贵,然后在構(gòu)造函數(shù)中把要適配的數(shù)據(jù)傳入菠镇。
        ArrayAdapter<String> arrayAdapter= new ArrayAdapter<String> (
                MainActivity.this, android.R.layout.simple_list_item_1,data);
        ListView listView = (ListView) findViewById(R.id.listview);
        listView.setAdapter(arrayAdapter);
        }
    }

例子中以數(shù)組的方式來傳遞數(shù)據(jù),里面包含很多水果的名字承璃。
數(shù)組中的數(shù)據(jù)無法直接傳遞給ListView,這時需要借助適配器(Adapter)來完成利耍。
Android中提供了很多適配器,這里使用的是ArrayAdapter,它可以通過泛型來指定要適配的數(shù)據(jù)類型,然后在構(gòu)造函數(shù)中把要適配的數(shù)據(jù)傳入盔粹。


image

因?yàn)閿?shù)據(jù)都是字符串隘梨,所以ArrayAdapter的泛型指定為String。
ArrayAdapter的構(gòu)造函數(shù)傳入3個數(shù)據(jù):

  • 1是Context 傳入當(dāng)前的上下文
  • 2是ListView子項(xiàng)布局的ID
  • 3是要適配的數(shù)據(jù)

android.R.layout.simple_list_item_1作為ListView子項(xiàng)布局的ID舷嗡,這時安卓內(nèi)置的布局文件轴猎。里面只有一個TextView,可用于顯示一段文本进萄。

最后調(diào)用ListView的setAdapter()方法將構(gòu)建好的適配器對象傳遞進(jìn)去捻脖。

運(yùn)行效果:


image

定制ListView界面

對ListView界面進(jìn)行定制锐峭,讓其可以顯示更豐富的內(nèi)容。
為每個水果加上圖片

新建fruit.java

定義一個實(shí)體類可婶,作為ListView適配器的適配類型沿癞。

public class Fruit {
    private String name;
    private int imageId;
    public Fruit (String name,int imageId){
        this.name = name;
        this.imageId = imageId;
    }
    public String getName() {
        return name;
    }
    public int getImageId() {
        return imageId;
    }
}

新建布局文件 fruit_item.xml

創(chuàng)建ImageView來顯示水果圖片,TextView來顯示水果名字扰肌。并讓TextView在垂直方向上居中顯示抛寝。

<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
>
    <ImageView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruit_image"/>
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:id="@+id/fruitname"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>
</LinearLayout>

新建 FruitAdapter.java

public class FruitAdapter extends ArrayAdapter<Fruit> {

    private int resourceId;

    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects){
        super(context,textViewResourceId,objects);
        resourceId = textViewResourceId;

    }


    @Override
    public View getView(int position, View convertView, ViewGroup parent){
       Fruit fruit = getItem(position); //獲取當(dāng)前項(xiàng)的Fruit實(shí)例
       View view= LayoutInflater.from(getContext()).inflate(resourseId,parent,false);
       ImageView fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
       TextView fruitName =(TextView) view.findViewById(R.id.fruitname);
       fruitImage.setImageResource(fruit.getImageId());
       fruitName.setText(fruit.getName());
       return view;
    }
}

FruitAdapter 重寫了父類的構(gòu)造函數(shù),用于將上下文曙旭,ListView子項(xiàng)布局的ID和要適配的數(shù)據(jù)傳遞進(jìn)去。

重寫getView()方法晶府,這個方法在每個子項(xiàng)被滾動到屏幕內(nèi)的時候會被調(diào)用桂躏。
首先通過getItem()得到當(dāng)前的項(xiàng)的Fruit實(shí)例,然后使用LayoutInflater來為這個子項(xiàng)加載我們傳入的布局川陆。

LayoutInflater.from(getContext()).inflate(resourseId,parent,false);
inflate接受三個參數(shù)

  • 一個是加載的布局文件id
  • 另一個是給加載好的布局再添加一個父布局
  • false表示只讓我們在父布局中聲明的layout屬性生效剂习,但不會為這個view添加父布局。

修改 MainActivity.java

public class MainActivity extends AppCompatActivity {
    private List<Fruit> fruitList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruits();// 初始化水果數(shù)據(jù)

       FruitAdapter arrayAdapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);

        ListView listView = (ListView) findViewById(R.id.listview);
        listView.setAdapter(arrayAdapter);
    }


   private void initFruits(){
       for( int i =0; i<2;i++){
           Fruit apple = new Fruit("Apple",R.drawable.apple_pic);
           fruitList.add(apple);
           Fruit banana = new Fruit("Banana",R.drawable.banana_pic);
           fruitList.add(banana);
           Fruit orange = new Fruit("Orange",R.drawable.orange_pic);
           fruitList.add(orange);
           Fruit watermelon = new Fruit("Watermelon",R.drawable.watermelon_pic);
           fruitList.add(watermelon);
           Fruit pear = new Fruit("Pear",R.drawable.pear_pic);
           fruitList.add(pear);
           Fruit grape = new Fruit("Grape",R.drawable.grape_pic);
           fruitList.add(grape);
           Fruit pineapple = new Fruit("Pineapple",R.drawable.pineapple_pic);
           fruitList.add(pineapple);
           Fruit strawberry = new Fruit("Strawberry",R.drawable.strawberry_pic);
           fruitList.add(strawberry);
           Fruit cherry = new Fruit("Cherry",R.drawable.cherry_pic);
           fruitList.add(cherry);
           Fruit mango = new Fruit("Mango",R.drawable.mango_pic);
           fruitList.add(mango);

       }
   }
}

添加initFruit()方法來初始化所有的水果數(shù)據(jù)较沪。

運(yùn)行結(jié)果:


image

提升ListView的運(yùn)行效率

上面的代碼中鳞绕,F(xiàn)ruitAdapter的getView()每次都將布局重新加載了一遍,當(dāng)ListView快速滾動時尸曼,就會成為性能的瓶頸们何。
為了解決這問題,需要對ListView進(jìn)行優(yōu)化控轿。

修改FruitAdapter.java

@Override
    public View getView(int position, View convertView, ViewGroup parent){
        Fruit fruit = getItem(position); //獲取當(dāng)前項(xiàng)的Fruit實(shí)例
        View view;
        ViewHolder viewHolder;
        if (convertView == null){
            view = LayoutInflater.from(getContext()).inflate(resourceId,parent,false);
            viewHolder = new ViewHolder();
            viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
            viewHolder.fruitName =(TextView) view.findViewById(R.id.fruitname);
            view.setTag(viewHolder);// 將ViewHolder存儲在View中冤竹。
        }else
        {
            view = convertView;
            viewHolder=(ViewHolder)view.getTag(); //重新獲取ViewHolder

        }
        viewHolder.fruitImage.setImageResource(fruit.getImageId());
        viewHolder.fruitName.setText(fruit.getName());
        return view;
    }

    class ViewHolder{
        ImageView fruitImage;
        TextView fruitName;
    }

getView中的convertView參數(shù),用于將之前加載好的布局進(jìn)行緩存茬射,以便以后可以進(jìn)行重用鹦蠕。

  • convertView為null時,使用LayoutInflater去加載布局在抛。
  • 如果不是Null,則直接對convertView進(jìn)行重用钟病。

內(nèi)部類ViewHolder用于對控件的實(shí)例進(jìn)行緩存。

  • 當(dāng)convertView為null時
    創(chuàng)建ViewHolder對象刚梭,并將控件的實(shí)例都存到ViewHolder去肠阱,然后調(diào)用View的setTag()方法,將ViewHolder對象存儲于View中望浩。
  • 當(dāng)convertView不為null時
    調(diào)用View的setTag()方法辖所,把ViewHolder重新取出。

LiewView的點(diǎn)擊事件

修改MainActivity.java

@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initFruits();// 初始化水果數(shù)據(jù)

        FruitAdapter arrayAdapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);

        ListView listView = (ListView) findViewById(R.id.listview);
        listView.setAdapter(arrayAdapter);
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener()
        {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,int position, long id){
                Fruit fruit = fruitList.get(position);
                Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_SHORT).show();

            }


        });

使用setOnItemClickListener()為ListView注冊了一個監(jiān)聽器磨德。
通過position參數(shù)判斷出用戶點(diǎn)擊的是哪一個子項(xiàng)缘回。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末吆视,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子酥宴,更是在濱河造成了極大的恐慌啦吧,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,222評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拙寡,死亡現(xiàn)場離奇詭異授滓,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)肆糕,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,455評論 3 385
  • 文/潘曉璐 我一進(jìn)店門般堆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人诚啃,你說我怎么就攤上這事淮摔。” “怎么了始赎?”我有些...
    開封第一講書人閱讀 157,720評論 0 348
  • 文/不壞的土叔 我叫張陵和橙,是天一觀的道長。 經(jīng)常有香客問我造垛,道長魔招,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,568評論 1 284
  • 正文 為了忘掉前任五辽,我火速辦了婚禮办斑,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘奔脐。我一直安慰自己俄周,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,696評論 6 386
  • 文/花漫 我一把揭開白布髓迎。 她就那樣靜靜地躺著峦朗,像睡著了一般。 火紅的嫁衣襯著肌膚如雪排龄。 梳的紋絲不亂的頭發(fā)上波势,一...
    開封第一講書人閱讀 49,879評論 1 290
  • 那天,我揣著相機(jī)與錄音橄维,去河邊找鬼尺铣。 笑死,一個胖子當(dāng)著我的面吹牛争舞,可吹牛的內(nèi)容都是我干的凛忿。 我是一名探鬼主播,決...
    沈念sama閱讀 39,028評論 3 409
  • 文/蒼蘭香墨 我猛地睜開眼竞川,長吁一口氣:“原來是場噩夢啊……” “哼店溢!你這毒婦竟也來了叁熔?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,773評論 0 268
  • 序言:老撾萬榮一對情侶失蹤床牧,失蹤者是張志新(化名)和其女友劉穎荣回,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體戈咳,經(jīng)...
    沈念sama閱讀 44,220評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡心软,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,550評論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了著蛙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片删铃。...
    茶點(diǎn)故事閱讀 38,697評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖册踩,靈堂內(nèi)的尸體忽然破棺而出泳姐,到底是詐尸還是另有隱情,我是刑警寧澤暂吉,帶...
    沈念sama閱讀 34,360評論 4 332
  • 正文 年R本政府宣布,位于F島的核電站缎患,受9級特大地震影響慕的,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜挤渔,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,002評論 3 315
  • 文/蒙蒙 一肮街、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧判导,春花似錦嫉父、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,782評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至擂红,卻和暖如春仪际,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背昵骤。 一陣腳步聲響...
    開封第一講書人閱讀 32,010評論 1 266
  • 我被黑心中介騙來泰國打工树碱, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人变秦。 一個月前我還...
    沈念sama閱讀 46,433評論 2 360
  • 正文 我出身青樓成榜,卻偏偏與公主長得像,于是被迫代替她去往敵國和親蹦玫。 傳聞我的和親對象是個殘疾皇子赎婚,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,587評論 2 350

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