Android04-自定義控件及ListView的使用

自定義控件

第一步:搭建好布局

<?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"
    android:background="@drawable/title_bg"
    >

    <Button
        android:id="@+id/title_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dp"
        android:background="@drawable/back_bg"
        android:text="Back"
        android:textColor="#fff"
        />

    <TextView
        android:id="@+id/tiitle_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center"
        android:text="Title Text"
        android:textColor="#fff"
        android:textSize="24sp"
        />

    <Button
        android:id="@+id/title_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dp"
        android:background="@drawable/edit_bg"
        android:text="Edit"
        android:textColor="#fff"
        />

</LinearLayout>

第二步,實(shí)現(xiàn)自定義控件的點(diǎn)擊事件等

具體做法:創(chuàng)建一個(gè)類繼承自LinearLayout,然后動(dòng)態(tài)加載第一步搭建的xml文件

public class TitleLayout extends LinearLayout {
    //重寫構(gòu)造函數(shù)
    public TitleLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        //LayoutInflater的from()方法可以構(gòu)造一個(gè)LayoutInflater對(duì)象难咕,然后調(diào)用inflate可以動(dòng)態(tài)加載一個(gè)布局文件
        //inflate()方法接收兩個(gè)參數(shù),1.要加載的布局文件的id泛烙,2.加載好的布局添加一個(gè)父布局理卑。
        LayoutInflater.from(context).inflate(R.layout.title, this);

        //監(jiān)聽返回按鈕的點(diǎn)擊事件
        Button titleBack = (Button) findViewById(R.id.title_back);
        Button titleEdit = (Button) findViewById(R.id.title_edit);
        titleBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                //當(dāng)前activity出棧
                ((Activity) getContext()).finish();
            }
        });
        //Edit按鈕的點(diǎn)擊事件
        titleEdit.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), "點(diǎn)擊了編輯按鈕", Toast.LENGTH_SHORT).show();
            }
        });
    }
}

第三步:在activity的layout文件中添加自定義控件

<?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="match_parent">
    <com.example.anwser_mac.customviewtest.TitleLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        />
</LinearLayout>
自定義控件.png

ListView的簡單用法

類似iOS的TableView

第一步,布局ListView

<?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/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </ListView>

</LinearLayout>

第二步蔽氨,設(shè)置ListView展示的數(shù)據(jù)

需要注意的是藐唠,ListView的數(shù)據(jù)展示需要借助適配器來實(shí)現(xiàn)帆疟;ArrayAdapter適配器可以通過泛型來指定要適配的數(shù)據(jù)類型。

public class MainActivity extends AppCompatActivity {
    private String[] data = {"apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple", "apple"};
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);
        //ArrayAdapter構(gòu)造函數(shù)宇立,依次傳入當(dāng)前上下文踪宠,ListView子項(xiàng)布局的id,以及要適配的數(shù)據(jù)
        //android.R.layout.simple_list_item_1 :Android的一個(gè)內(nèi)置布局文件泄伪,里面只有一個(gè)TextView
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }
}

自定義ListView的界面

第一步:定義一個(gè)實(shí)體類殴蓬,存儲(chǔ)ListView要顯示的數(shù)據(jù)。

新建Fruit實(shí)體類

public class Fruit {
    //水果名
    private String name;
    //顯示的圖片id
    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;
    }
}

第二步:搭建ListViewItem蟋滴,用來展示實(shí)體類存儲(chǔ)的數(shù)據(jù)

新建listItem.xml布局文件

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/fruit_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/fruit_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>

</LinearLayout>

第三步染厅,自定義適配器(Adapter)

創(chuàng)建一個(gè)FruitAdapter繼承自ArrayAdapter

public class FruitAdapter extends ArrayAdapter<Fruit> {

    private int resourceId;
    //重寫構(gòu)造方法,將上下文津函、ListView子項(xiàng)布局的ID和數(shù)據(jù)都傳進(jìn)來
    public FruitAdapter(Context context, int textViewResourceId, List<Fruit> objects) {
        super(context, textViewResourceId, objects);
        resourceId = textViewResourceId;
    }

    //重寫getView()方法肖粮,這個(gè)方法在子項(xiàng)被滾動(dòng)屏幕內(nèi)時(shí)調(diào)用
    @NonNull
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //獲取當(dāng)前項(xiàng)的Fruit實(shí)例
        Fruit fruit = getItem(position);
        View view;
        //創(chuàng)建一個(gè)viewHolder來緩存控件,這樣就不用每次加載的時(shí)候都要調(diào)用findViewById()來獲得控件的實(shí)例了
        ViewHodler viewHolder;
        // 加載布局
        if (convertView == null) {
            //創(chuàng)建
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHodler();
            viewHolder.fruitImage = (ImageView) view.findViewById(R.id.fruit_image);
            viewHolder.fruitName = (TextView) view.findViewById(R.id.fruit_name);
            //把viewHolder存入view中
            view.setTag(viewHolder);
        } else {
            view = convertView;
            //重新取出viewHolder
            viewHolder = (ViewHodler) view.getTag();
        }
        //設(shè)置布局顯示的數(shù)據(jù)
        viewHolder.fruitImage.setImageResource(fruit.getImageId());
        viewHolder.fruitName.setText(fruit.getName());
        return view;

    }
}

class ViewHodler {

    ImageView fruitImage;

    TextView fruitName;
}

第四步:在activity中加載listView

public class MainActivity extends AppCompatActivity {

    private List<Fruit> fruitList = new ArrayList<>();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.layout);

        //初始化水果數(shù)據(jù)
        initFruits();
        FruitAdapter adapter = new FruitAdapter(MainActivity.this, R.layout.fruit_item, fruitList);
        //設(shè)置listView的數(shù)據(jù)
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }



    private void initFruits() {
        for (int i = 0; i < 2; i++) {
            Fruit apple = new Fruit("apple", R.drawable.apple_pic);
            fruitList.add(apple);

            Fruit bananna = new Fruit("Banana", R.drawable.banana_pic);
            fruitList.add(bananna);

            Fruit orange = new Fruit("Orange", R.drawable.orange_pic);
            fruitList.add(orange);

            Fruit watermelo = new Fruit("waterelon", R.drawable.watermelon_pic);
            fruitList.add(watermelo);

            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("cherry", R.drawable.cherry_pic);
            fruitList.add(strawberry);
        }
    }
}

ListView的點(diǎn)擊事件

使用setOnItemClickLister()方法為ListView注冊(cè)一個(gè)監(jiān)聽器尔苦,當(dāng)用戶點(diǎn)擊ListView的任何一個(gè)子項(xiàng)時(shí)涩馆,就會(huì)回調(diào)onItemClick()方法。

        ///監(jiān)聽listView的點(diǎn)擊事件
        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();
            }
        });
自定義listView.png
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末允坚,一起剝皮案震驚了整個(gè)濱河市魂那,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌稠项,老刑警劉巖涯雅,帶你破解...
    沈念sama閱讀 212,884評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異展运,居然都是意外死亡活逆,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,755評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門拗胜,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蔗候,“玉大人,你說我怎么就攤上這事埂软⌒庖#” “怎么了?”我有些...
    開封第一講書人閱讀 158,369評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵勘畔,是天一觀的道長迷殿。 經(jīng)常有香客問我,道長咖杂,這世上最難降的妖魔是什么庆寺? 我笑而不...
    開封第一講書人閱讀 56,799評(píng)論 1 285
  • 正文 為了忘掉前任,我火速辦了婚禮诉字,結(jié)果婚禮上懦尝,老公的妹妹穿的比我還像新娘知纷。我一直安慰自己,他們只是感情好陵霉,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,910評(píng)論 6 386
  • 文/花漫 我一把揭開白布琅轧。 她就那樣靜靜地躺著,像睡著了一般踊挠。 火紅的嫁衣襯著肌膚如雪乍桂。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 50,096評(píng)論 1 291
  • 那天效床,我揣著相機(jī)與錄音睹酌,去河邊找鬼。 笑死剩檀,一個(gè)胖子當(dāng)著我的面吹牛憋沿,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播沪猴,決...
    沈念sama閱讀 39,159評(píng)論 3 411
  • 文/蒼蘭香墨 我猛地睜開眼辐啄,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了运嗜?” 一聲冷哼從身側(cè)響起壶辜,我...
    開封第一講書人閱讀 37,917評(píng)論 0 268
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎担租,沒想到半個(gè)月后砸民,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,360評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡翩活,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,673評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了便贵。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片菠镇。...
    茶點(diǎn)故事閱讀 38,814評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖承璃,靈堂內(nèi)的尸體忽然破棺而出利耍,到底是詐尸還是另有隱情,我是刑警寧澤盔粹,帶...
    沈念sama閱讀 34,509評(píng)論 4 334
  • 正文 年R本政府宣布隘梨,位于F島的核電站,受9級(jí)特大地震影響舷嗡,放射性物質(zhì)發(fā)生泄漏轴猎。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,156評(píng)論 3 317
  • 文/蒙蒙 一进萄、第九天 我趴在偏房一處隱蔽的房頂上張望捻脖。 院中可真熱鬧锐峭,春花似錦、人聲如沸可婶。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,882評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽矛渴。三九已至椎扬,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間具温,已是汗流浹背蚕涤。 一陣腳步聲響...
    開封第一講書人閱讀 32,123評(píng)論 1 267
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留桂躏,地道東北人钻趋。 一個(gè)月前我還...
    沈念sama閱讀 46,641評(píng)論 2 362
  • 正文 我出身青樓,卻偏偏與公主長得像剂习,于是被迫代替她去往敵國和親蛮位。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,728評(píng)論 2 351

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