《第一行代码》ListView控件使用
本文將根據《第一行代碼》的內容進行ListView控件的簡單使用講解。
文章目錄
- 一、關于ListView是什么
- 二、ListView的使用效果
- 三、ListView如何使用
- 3.1 ListViewTest的項目創建
- 3.2 ListView手動添加數據
- 3.3 ListView的運行效果
- 四、ListView畫面的定制
- 4.1 新建實體類
- 4.2 ListView布局指定
- 4.3 自定義適配器
- 4.4 數據初始化以及數據添加
- 4.5 ListView設置點擊事件
- 五、其他
一、關于ListView是什么
ListView是 Android 系統為我們提供的一種列表顯示的一種控件,使用它可以用來顯示我們常見的列表形式。繼承自抽象類AdapterView。
二、ListView的使用效果
如下圖所示
這就是一種簡單的ListView的實現效果,這些書籍圖片加上右邊的文字等構成了ListView列表。
三、ListView如何使用
3.1 ListViewTest的項目創建
ListView項目創建完成以后,系統會自動生成activity_main.xml文件,修改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"><ListViewandroid:id="@+id/list_view"android:layout_width="match_parent"android:layout_height="wrap_content"/> </LinearLayout>說明:在布局里面先加入ListView控件,然后將長和寬都設置為match_parent,這樣ListView就可以占滿整個布局的空間。
3.2 ListView手動添加數據
在MainActivity活動中設置一個String型的水果數組。
public class MainActivity extends AppCompatActivity {private String[] data = {"apple", "banana", "orange", "cherry", "watermelon", "pear", "grape", "prineapple", "strawberry","apple", "banana" +"orange", "cherry", "watermelon", "pear", "grape", "prineapple", "strawberry"}; } ......數據有了,但是數據是不能直接傳遞給ListView的,需要借助適配器來完成。我們知道,安卓提供了很多適配器的實現類,本文將以ArrayAdapter適配器為例來講解。
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);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter); }說明:android.R.layout.simple_list_item_1作為ListView的id,這是安卓的一個內置的布局文件,里面只有一個TestView。
3.3 ListView的運行效果
四、ListView畫面的定制
只有一些文本列表的ListView顯示過于簡單,接下來我們將對ListView的界面進行定制,讓它的內容更加的豐富。
4.1 新建實體類
新建Fruit實體類,作為ListView適配器的適配類型。
public class Fruit {private String name;private int imageId;public Fruit(String name,int imageId){this.imageId = imageId;this.name = name;}public String getName(){return name;}public int getImageId(){return imageId;} }說明:定義了String型的name以及int型的imageld,并提供了get()、set()方法。
4.2 ListView布局指定
為ListView的子項指定一個我們自定義的布局,在layout目錄下新建fruit_item。
<?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"><ImageViewandroid:id="@+id/fruit_image"android:layout_width="40dp"android:layout_height="40dp"/><TextViewandroid:id="@+id/fruit_name"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_gravity="center_vertical"android:layout_marginLeft="10dp"/> </LinearLayout>4.3 自定義適配器
定義一個適配器,使這個適配器繼承ArrayAdapter,并講其泛型指定為Fruit類。新建適配器FruitAdapter。
public class FruitAdapter extends ArrayAdapter<Fruit> {private int resourceId;public FruitAdapter(@NonNull Context context, int textViewResourceId, @NonNull List<Fruit> objects) {super(context, textViewResourceId, objects);resourceId = textViewResourceId;}public View getView(int positon, View convertView, ViewGroup parent){Fruit fruit = getItem(positon);//獲得當前Fruit實例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.fruit_name);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{TextView fruitName;ImageView fruitImage;} }說明:FruitAdapter重寫了父類的一組構造函數,用于將上下文、ListView子項布局的Id和數據都傳遞進來。另外又重寫了getView方法,定義了view和viewholder。這個方法在每個子項被滾動到屏幕前都會被調用。在此方法中,首先通過getItem()方法的帶當前的Fruit實例,然后使用LayoutInflater來作為這個子項加載我們傳入的布局。這里對適配器做了小小的優化,在view的定義的時候沒有直接為接入Fruit實例,而是判斷convertView是否為空。當converView為空就將convertView賦給view,然后對控件進行獲取、賦值的操作并且調用view的setTag()方法將ViewHolder存儲在View中,如果不為空,就將convertView賦值給view,并調用getTag()方法重新獲取viewHolder。
convertView參數是用于將之前加載好的布局進行緩存,以便下次使用。
4.4 數據初始化以及數據添加
對MainActivity活動進行修改。
public class MainActivity extends AppCompatActivity {private List<Fruit> fruitList = new ArrayList<>();private String[] data = {"apple", "banana", "orange", "cherry", "watermelon", "pear", "grape", "prineapple", "strawberry","apple", "banana" +"orange", "cherry", "watermelon", "pear", "grape", "prineapple", "strawberry"};@Overrideprotected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);initFruit();//初始水果數據FruitAdapter adapter = new FruitAdapter(MainActivity.this,R.layout.fruit_item,fruitList);ListView listView = (ListView) findViewById(R.id.list_view);listView.setAdapter(adapter);listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {Fruit fruit = fruitList.get(position);Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_SHORT).show();}});}private void initFruit() {for(int i = 0 ; i< 5 ;i++ ){Fruit apple = new Fruit("apple",R.drawable.img);fruitList.add(apple);Fruit banana = new Fruit("banana",R.drawable.img_1);fruitList.add(banana);Fruit orange = new Fruit("orange",R.drawable.img_2);fruitList.add(orange);Fruit cherry = new Fruit("cherry",R.drawable.img_3);fruitList.add(cherry);Fruit watermelon = new Fruit("matermelon",R.drawable.img_4);fruitList.add(watermelon);Fruit pear = new Fruit("pear",R.drawable.img_5);fruitList.add(pear);Fruit prineaplle = new Fruit("prineaplle",R.drawable.img_6);fruitList.add(prineaplle);Fruit strawberry = new Fruit("strawberry",R.drawable.img_7);fruitList.add(strawberry);}} }說明:首先new了一個以Fruit類型的List列表,然后添加了initFruits()方法為每一項子項設置名字以及相關的圖片(圖片請自己添加),并在onCreate()方法中調用initFruits()對數據初始化,最后創建了Adapter對象并將Adapter作為適配器傳遞給ListView。
效果展示如圖所示:
4.5 ListView設置點擊事件
雖然ListView已經和文章開頭的那張淘寶圖片類似了些,但其實還差的遠,接下來將為已經寫好的ListView設置每一個子項的點擊事件,點擊圖片或者文字即可顯示該水果的名稱。
在MainActivity中定義listView
ListView listView = (ListView) findViewById(R.id.list_view);為listView設置點擊事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {@Overridepublic void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {Fruit fruit = fruitList.get(position);Toast.makeText(MainActivity.this,fruit.getName(),Toast.LENGTH_SHORT).show();} });好啦,這樣就可以實現listView的點擊啦!
五、其他
第一次寫博客!
本人是一名大一的小菜雞,很多地方也不懂,參考《第一行代碼》寫這篇博客用來記錄ListView的基本用法,因為老是忘記哈哈!如果有錯誤的地方或者不足之處以及可以優化的地方歡迎指出!
總結
以上是生活随笔為你收集整理的《第一行代码》ListView控件使用的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 玩转oracle 11g(37):rma
- 下一篇: java executequery,JD