Android常見界面控件二

一、ListView的使用

 ListView以列表的形式展示數據內容,並且能夠根據列表的高度自適應屏幕顯示。

屬性名稱

功能描述

android:listSelector

當條目被點擊後,改變條目的背景顏色

android:divider

設置分割線的顏色

android:dividerHeight

設置分割線的高度

android:scrollbars

是否顯示滾動條

android:fadingEdge

去掉上邊和下邊的黑色陰影

   常用數據適配器(Adapter):數據適配器是數據與視圖之間的橋樑,它類似於一個轉換器,將複雜的數據轉換成用戶可以接受的方式進行呈現。

    常用的數據適配器 BaseAdapter、SimpleAdapter 、ArrayAdapter

    ①BaseAdapter顧名思義是基本的適配器。他實際上是一個抽象類,通常在自定義適配器時會繼承BaseAdapter。

    BaseAdapter中的方法

 

方法名稱
功能描述
public int getCount()
獲取Item條目的總數
public Object getItem(int position)
根據position(位置)獲取某個Item的對象
public long getItemId(int position)
根據position(位置)獲取某個Item的id
public View getView(int position, View convertView, ViewGroup parent)
獲取相應position對應的Item視圖,position是當前Item的位置,convertView用於複用舊視圖,parent用於加載XML佈局。

 

②SimpleAdapter繼承自BaseAdapter,實現了BaseAdapter的四個抽象方法並進行封裝。因此在使用SimpleAdapter進行數據適配時,只需要在構造方法中傳入相應的參數即可。SimpleAdapter的構造方法的具體信息如下:

③ArrayAdapter也是BaseAdapter的子類,用法與SimpleAdapter類似,開發者只需要在構造方法裏面傳入相應參數即可。ArrayAdapter通常用於適配TextView控件。的構造方法如下:

public ArrayAdapter(Context context,int resource);    //context上下文對象 resource Item佈局的資源ID
public ArrayAdapter(Context context,int resource, int textViewResourceId);    //textViewResourceId    Item佈局中相應TextView的id
public ArrayAdapter(Context context,int resource,T[] objects);    //objects    需要適配的數組類型的數據
public ArrayAdapter(Context context,int resource,int textViewResourceId,T[] objects);    
public ArrayAdapter(Context context,int resource,List<T> objects);
public ArrayAdapter(Context context,int resource,int textViewResourceId, List<T> objects)    //需要適配的List類型的數據

ListView案例:

activity_main.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=".MainActivity"
    android:orientation="vertical">


    <TextView
        android:layout_width="match_parent"
        android:layout_height="45dp"
        android:text="購物商城"
        android:textColor="#FFFFFF"
        android:background="#FF8F03"
        android:gravity="center"
        />
    <ListView
        android:id="@+id/lv"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


</LinearLayout>

list_item.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ImageView
        android:id="@+id/iv"
        android:layout_width="120dp"
        android:layout_height="90dp"
        android:layout_centerVertical="true"/>
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_toRightOf="@+id/iv"
        android:layout_centerVertical="true">
        <TextView
            android:id="@+id/title"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="桌子"
            android:textSize="20sp"
            android:textColor="#000000"/>
        <TextView
            android:id="@+id/tv_price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="價格"
            android:textSize="20sp"
            android:layout_marginTop="10dp"
            android:layout_below="@+id/title"
            android:textColor="#FF8F03"/>
        <TextView
            android:id="@+id/price"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:text="1000"
            android:textSize="20sp"
            android:layout_below="@+id/title"
            android:layout_toRightOf="@id/tv_price"
            android:textColor="#FF8F03"
            android:layout_marginTop="10dp"/>

    </RelativeLayout>

</RelativeLayout>

 

MainActivity.java

package com.example.listviewdemo;


import androidx.appcompat.app.AppCompatActivity;


import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;


import org.w3c.dom.Text;


public class MainActivity extends AppCompatActivity {
    private String[] titles = {"桌子","蘋果","蛋糕","線衣","獼猴桃"};
    private String[] prices = {"1800元","10元/kg","300元","350元","10元/kg"};
    private int[] icons = {R.drawable.table,R.drawable.apple,R.drawable.cakes,R.drawable.wireclothes,R.drawable.scarf};


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        ListView listView = findViewById(R.id.lv);
        MyBaseAdapter adapter = new MyBaseAdapter();
        listView.setAdapter(adapter);
    }


    class MyBaseAdapter extends BaseAdapter{


        @Override
        public int getCount() {         //獲取item總數
            return titles.length;
        }


        @Override
        public Object getItem(int i) {      //返回items的數據對象
            return titles[i];
        }


        @Override
        public long getItemId(int i) {      //返回items的id
            return i;
        }


        @Override
        public View getView(int i, View convertview, ViewGroup viewGroup) {    //返回items的view視圖
            //方案一
//            //將xml轉換成view對象
//            View view = View.inflate(MainActivity.this,R.layout.list_item,null);
//            //初始化view對象的控件
//            TextView title = view.findViewById(R.id.title);
//            TextView price = view.findViewById(R.id.price);
//            ImageView imageView = view.findViewById(R.id.iv);
//            title.setText(titles[i]);
//            price.setText(prices[i]);
//            imageView.setImageResource(icons[i]);
//            return view;
            ViewHolder holder;
            if(convertview == null){
                convertview = View.inflate(MainActivity.this,R.layout.list_item,null);
                holder = new ViewHolder();
                holder.title = convertview.findViewById(R.id.title);
                holder.price = convertview.findViewById(R.id.price);
                holder.iv = convertview.findViewById(R.id.iv);
                convertview.setTag(holder);
            }else{
                holder = (ViewHolder)convertview.getTag();
            }
            holder.title.setText(titles[i]);
            holder.price.setText(prices[i]);
            holder.iv.setImageResource(icons[i]);


            return convertview;
        }
    }
    class ViewHolder{
        TextView title;
        TextView price;
        ImageView iv;
    }
}

運行結果:

二、RecyclerVi ew的使用

RecyclerView:是Android5.0之後提供的用於在有限的窗口範圍內顯示大量數據的控件。

 

與ListView相比,RecyclerView的優勢爲: 

  • 展示效果:RecyclerView控件可以通過LayoutManager類實現橫向或豎向的列表效果、瀑布流效果和GridView效果,而ListView控件只能實現豎直的列表效果。 

  • 適配器:RecyclerView控件使用的是RecyclerView.Adapter適配器,該適配器將BaseAdapter中的getView()方法拆分爲onCreateViewHolder()方法和onBindViewHolder()方法,強制使用ViewHolder類,使代碼編寫規範化,避免了初學者寫的代碼性能不佳。

與ListView相比,RecyclerView的優勢爲:

  • 複用效果:RecyclerView控件複用Item對象的工作由該控件自己實現,而ListView控件複用Item對象的工作需要開發者通過convertView的setTag()方法和getTag()方法進行操作。 

  • 動畫效果:RecyclerView控件可以通過setItemAnimator()方法爲Item添加動畫效果,而ListView控件不可以通過該方法爲Item添加動畫效果。

示例:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity">
    <androidx.recyclerview.widget.RecyclerView
        android:id="@+id/recycleview"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </androidx.recyclerview.widget.RecyclerView>
</RelativeLayout>

recycler_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"
    android:padding="16dp"
    android:orientation="horizontal">


    <ImageView
        android:id="@+id/iv"
        android:layout_width="120dp"
        android:layout_height="90dp"
        android:src="@drawable/siberiankusky"/>
    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="10dp"
        android:layout_marginTop="5dp">
        <TextView
            android:id="@+id/name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:textColor="#FF8F03"
            android:text="哈士奇"/>
        <TextView
            android:id="@+id/introduce"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textSize="16sp"
            android:layout_marginTop="10dp"
            android:layout_below="@+id/name"
            android:textColor="#FF716C"
            android:minLines="2"
            android:ellipsize="end"
            android:text="西伯利亞雪橇犬,常見別名哈士奇,暱稱爲二哈"/>


    </RelativeLayout>


</LinearLayout>

MainActicty.java

package com.example.recyclerview;


import androidx.annotation.NonNull;
import androidx.appcompat.app.AppCompatActivity;
import androidx.recyclerview.widget.LinearLayoutManager;
import androidx.recyclerview.widget.RecyclerView;


import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ImageView;
import android.widget.TextView;


import org.w3c.dom.Text;


public class MainActivity extends AppCompatActivity {
    private RecyclerView recycleview;
    private HomeAdapter homeAdapter;
    private String[] names = { "小貓", "哈士奇", "小黃鴨","小鹿","老虎"};
    private int[]  icons= { R.drawable.cat,R.drawable.siberiankusky,
            R.drawable.yellowduck,R.drawable.fawn, R.drawable.tiger};
    private String[] introduces = {
            "貓,屬於貓科動物,分家貓、野貓,是全世界家庭中較爲廣泛的寵物。",
            "西伯利亞雪橇犬,常見別名哈士奇,暱稱爲二哈。",
            "鴨的體型相對較小,頸短,一些屬的嘴要大些。腿位於身體後方,因而步態蹣跚。",
            "鹿科是哺乳綱偶蹄目下的一科動物。體型大小不等,爲有角的反芻類。",
            "虎,大型貓科動物;毛色淺黃或棕黃色,滿有黑色橫紋;頭圓、耳短,耳背面黑色,中央有一白斑甚顯著;四肢健壯有力;尾粗長,具黑色環紋,尾端黑色。"
    };


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        recycleview = findViewById(R.id.recycleview);   //初始化recycleview
        recycleview.setLayoutManager(new LinearLayoutManager(this/*,LinearLayoutManager.HORIZONTAL,true*/));//設置recleview 的佈局方式爲線性佈局默認爲垂直方向
        homeAdapter = new HomeAdapter();
        recycleview.setAdapter(homeAdapter);    //設置適配器
    }


    class HomeAdapter extends RecyclerView.Adapter<HomeAdapter.MyViewHolder>{   //自定義適配器


        @NonNull
        @Override
        public MyViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
            View view = LayoutInflater.from(MainActivity.this).inflate(R.layout.recylcer_item,parent,false);    //將xml轉換成view控件
            MyViewHolder myViewHolder = new MyViewHolder(view);     //放置在Holder中
            return myViewHolder;
        }


        @Override
        public void onBindViewHolder(@NonNull MyViewHolder holder, int position) {  //給適配器綁定Holder
            holder.name.setText(names[position]);
            holder.introduce.setText(introduces[position]);
            holder.iv.setImageResource(icons[position]);
        }


        @Override
        public int getItemCount() {
            return names.length;
        }   //返回items的長度


        class MyViewHolder extends RecyclerView.ViewHolder{     //自定義holder
            TextView name;
            TextView introduce;
            ImageView iv;
            public MyViewHolder(@NonNull View itemView) {   //設置holder的變量
                super(itemView);
                name =(TextView) itemView.findViewById(R.id.name);
                introduce =(TextView) itemView.findViewById(R.id.introduce);
                iv =(ImageView) itemView.findViewById(R.id.iv);
            }
        }
        }
    }

運行結果:

 

三、自定義View

當使用系統控件不滿足需求時,需要自定義控件。最簡單的自定義View就是創建一個類繼承自View類或者其子類,並重寫該類的構造方法。

public class Customview extends View{
    public Customview(Context context) {    //在Java代碼中創建對象時,使用該構造函數
         super(context);
     }
     public Customview(Context context, AttributeSet attrs) {    //在XML佈局中引入自定義控件時,使用該構造函數
         super(context, attrs);    
     }
 }

由於系統自帶的控件不能滿足需求中的某種樣式或功能,因此我們需要在自定義View中通過重寫指定的方法來添加額外的樣式和功能。

自定義View常用的3個方法如下: 

  • onMeasure()方法:測量尺寸。 

    onMeasure(int widthMeasureSpec, int heightMeasureSpec)

    widthMeasureSpec獲取父容器指定該控件的寬度,heightMeasureSpec獲取父容器指定該控件的高度

  • onDraw()方法:繪製圖像。 

    canvas表示畫布,他與Paint類(畫筆)配合使用。

  • onLayout()方法:指定佈局中子控件的位置。

    onLayout(boolean changed,int left,int top,int right,int bottom) 

    changed表示自定義View的大小和位置是否發生變化。left、top、right、bottom分別表示子控件與父容器左邊、頂部、右邊、底部的距離。

 

測量模式

  • EXACTLY:當自定義控件的寬高的值設置爲具體值時使用,如100dp,此時控件的寬高值是精確的尺寸。 

  • AT_MOST:當自定義控件的寬高值爲wrap_content時使用,此時控件的寬高值是控件中的數據內容可獲得的最大空間值。 

  • UNSPECIFIED:當父容器沒有指定自定義控件的寬高值時使用。

注意:參數widthMeasureSpec和heightMeasureSpec是父容器指定該控件的寬高,該控件還需要通過setMeasuredDimension(int,int)方法設置具體的寬高。

 

示例:

cirecleview.java

package com.example.myapplication;


import android.content.Context;
import android.graphics.Canvas;
import android.graphics.Color;
import android.graphics.Paint;
import android.util.AttributeSet;
import android.view.View;


import androidx.annotation.Nullable;


public class circleview extends View {


    public circleview(Context context) {
        super(context);
    }


    public circleview(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }


    @Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
        //半徑
        int r = getMeasuredHeight()/2;
        //圓心位置
        int centerX = getLeft() + r;
        int centerY = getTop() + r;
        Paint paint = new Paint();
        paint.setColor(Color.RED);


        //繪製
        canvas.drawCircle(centerX,centerY,r,paint);
    }
}

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout 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=".MainActivity">


    <com.example.myapplication.circleview
        android:layout_width="100dp"
        android:layout_height="100dp"
        tools:ignore="MissingConstraints" />


</RelativeLayout>

 

運行結果:

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章