第一行代碼筆記之——ListView


1.ListView 是啥

ListView  就是一個能顯示一排一排的東西View控件

 

2.使用ListView的步驟

  1. 創建一個class,代表你每一行想放的東東
  2. 給你每一行的東東一個布局文件,在activity的布局文件中加一個ListView  控件
  3. New一個ArrayList,用來儲存你想放的東東們
  4. 在Activity中寫一個初始化函數init(),初始化東東,然后把東東add到ArrayList中
  5. 如果是創建復雜控件,要建一個繼承於ArrayAdapter的類,再到里面添加復雜功能
  6. New一個你的ArrayAdapter,把每一行的那個xml文件和已初始化完畢的ArrayList給它
  7. New一個ListView  ,並findViewById,把ArrayAdapter給它。

 

3.最簡單的ListView

     1.在XML文件中添加一個ListView

<RelativeLayout 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:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    android:paddingBottom="@dimen/activity_vertical_margin" tools:context=".MainActivity">

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

</RelativeLayout>

      2.

          (1)在MainActivity中用一個Sting[]儲存每行數據

          (2)把數據給ArrayAdapter

          (3)把ArrayAdapter給ListView 

public class MainActivity extends Activity {

    private String[] data={"Apple","Banana","Orange","Watermelon","Pear","Grape","Pineapple","Strawberry","Cherry","Mango"};//要儲存的數據

    @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);//把每一行內容的XML文件與數據給ArrayAdapter
        ListView listView=(ListView)findViewById(R.id.list_view);
        listView.setAdapter(adapter);//把ArrayAdapter給ListView
    }

 

效果圖:

 

 

4.ListView的事件監聽器

listView.setOnItemClickListener(new OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> adapterView, View view, int position, long id) {
                Fruit fruit=fruitList.get(position);
                Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_LONG).show();
            }
        });

 

5.復雜的ListView

1.新建一個Fruit類

   作用:幫助我們儲存與獲得“水果名稱”,與“圖片ID”

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;
    }
}

 

2.新建一個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="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"
        android:layout_marginLeft="10dip"/>

</LinearLayout>

 

3.初始化數據

    步驟:

           ①new一個ArrayList<Fruit>

           ②在MainActivity中寫一個函數init()。

 

    作用:初始化數據,並將數據add到ArrayList<Fruit>中

public class MainActivity extends Activity 
{

    private List<Fruit> fruitList=new ArrayList<Fruit>();//①new一個ArrayList<Fruit>

    @Override
    protected void onCreate(Bundle savedInstanceState) 
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();//初始化數據
    }

    private void init()
    {
        Fruit apple=new Fruit("Apple",R.drawable.apple);fruitList.add(apple);//將數據add到ArrayList<Fruit>中
        Fruit banana=new Fruit("Banana",R.drawable.banana);fruitList.add(banana);
        Fruit orange=new Fruit("Orange",R.drawable.orange);fruitList.add(orange);
        Fruit watermelon=new Fruit("Watermelon",R.drawable.watermelon);fruitList.add(watermelon);
        Fruit pear=new Fruit("Pear",R.drawable.pear);fruitList.add(pear);
        Fruit grape=new Fruit("Grape",R.drawable.grape);fruitList.add(grape);
        Fruit pineapple=new Fruit("Pineapple",R.drawable.pineapple);fruitList.add(pineapple);
        Fruit strawberry=new Fruit("Strawberry",R.drawable.strawberry);fruitList.add(strawberry);
        Fruit cherry=new Fruit("Cherry",R.drawable.cherry);fruitList.add(cherry);
        Fruit mango=new Fruit("Mango",R.drawable.mango);fruitList.add(mango);
    }

 

4.新建一個繼承於ArrayAdapter<Fruit>的FruitAdapter類

   作用:用來設定水果名稱與水果圖片

public class FruitAdapter extends ArrayAdapter<Fruit>
{
    private int resourceId;//等會要把R.layout.fruit_item的值賦給resourceId
    
    class ViewHolder//用來暫存“水果名稱”的TextView控件與“水果圖片”的ImageView控件,避免每次都重新加載布局,優化程序的流暢度
    {
        ImageView fruitImage;
        TextView fruitName;
    }
    
    public FruitAdapter(Context context,int textViewResourceId,List<Fruit> objects)
    {
        super(context,textViewResourceId,objects);
        resourceId=textViewResourceId;//把R.layout.fruit_item的值賦給resourceId
    }

    public View getView(int position,View convertView,ViewGroup parent)//這個函數不是太清楚,大概是用來createView的,對於每一個添加進ArrayList<Fruit>的Fruit對象,都會執行一邊
    {
        Fruit fruit=getItem(position);//實例化在ArrayList<Fruit>中第“position”個當前Fruit對象

        View view;
        ViewHolder viewHolder;
        if (convertView==null)//如果布局從來沒有被加載過
        {
            view=LayoutInflater.from(getContext()).inflate(resourceId,null);//使用布局填充器來把fruit_item布局文件轉為View
            viewHolder=new ViewHolder();//新建一個ViewHolder
            viewHolder.fruitImage=(ImageView)view.findViewById(R.id.fruit_image);//從View中獲取ImageView,並暫存新建的ViewHolder中
            viewHolder.fruitName=(TextView)view.findViewById(R.id.fruit_name);//從View中獲取TextView,並暫存新建的ViewHolder中
            view.setTag(viewHolder);//使用setTag把查找的view緩存起來方便多次重用
        }
        else//布局被加載過
        {
            view=convertView;
            viewHolder=(ViewHolder)view.getTag();//把之前暫存的ViewHolder賦給viewHolder
        }

        viewHolder.fruitImage.setImageResource(fruit.getImageId());//設定水果圖片
        viewHolder.fruitName.setText(fruit.getName());//設定水果名稱

        return view;
    }
}

 

5把R.layout.fruit_item和初始化完畢的ArrayList<Fruit>給FruitAdapter,然后把FruitAdapter給ListView

public class MainActivity extends Activity
{

    private List<Fruit> fruitList=new ArrayList<Fruit>();//①new一個ArrayList<Fruit>

    @Override
    protected void onCreate(Bundle savedInstanceState)
    {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        init();//初始化數據
        FruitAdapter adapter=new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);//把R.layout.fruit_item和初始化完畢的ArrayList<Fruit>給FruitAdapter
        ListView listView=(ListView)findViewById(R.id.list_view);
        listView.setAdapter(adapter);//把FruitAdapter給ListView
    }

    private void init()
    {
        Fruit apple=new Fruit("Apple",R.drawable.apple);fruitList.add(apple);//將數據add到ArrayList<Fruit>中
        Fruit banana=new Fruit("Banana",R.drawable.banana);fruitList.add(banana);
        Fruit orange=new Fruit("Orange",R.drawable.orange);fruitList.add(orange);
        Fruit watermelon=new Fruit("Watermelon",R.drawable.watermelon);fruitList.add(watermelon);
        Fruit pear=new Fruit("Pear",R.drawable.pear);fruitList.add(pear);
        Fruit grape=new Fruit("Grape",R.drawable.grape);fruitList.add(grape);
        Fruit pineapple=new Fruit("Pineapple",R.drawable.pineapple);fruitList.add(pineapple);
        Fruit strawberry=new Fruit("Strawberry",R.drawable.strawberry);fruitList.add(strawberry);
        Fruit cherry=new Fruit("Cherry",R.drawable.cherry);fruitList.add(cherry);
        Fruit mango=new Fruit("Mango",R.drawable.mango);fruitList.add(mango);
    }
}

 

效果圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM