หลังจากตัวอย่างในตัวอย่างที่แล้ว ที่เราสร้าง ListActivity โดยแต่ละรายการมีรูปที่แตกต่างกันโดยใช้ SimpleAdapter วันนี้เราจะมาใช้ Adapter อีกตัวหนึ่งคือ BaseAdapter โดยวิธีการนี้เราต้องสร้าง class ขึ้นมาโดยสืบทอด BaseAdapter วิธีนี้เราสามารถควบคุมการแสดงผลได้มากกว่าที่ผ่านมา ตัวอย่างที่เราจะทำวันนี้ดัดแปลงมาจากตัวอย่างที่แล้ว โดยในแต่ละรายการจะมีจำนวน และให้ highlight แถวที่มีจำนวนน้อยกว่าหรือเท่ากับเกณฑ์ต่ำ โดยแต่ละรายการมีเกณฑ์ไม่เท่ากัน ลองดูผลลัพธ์ครับ
activity_main.xml
<ListView xmlns:android="http://schemas.android.com/apk/res/android"
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="match_parent"
/>
row.xml<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="horizontal"
android:gravity="center_vertical"
>
<TextView
android:id="@+id/name"
android:layout_width="0dp"
android:layout_height="match_parent"
android:layout_weight="1"
android:gravity="center_vertical"
android:drawableLeft="@drawable/ico_apple"
android:drawablePadding="10dp"
/>
<TextView
android:id="@+id/num"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="center_vertical"
android:paddingRight="20dp"
/>
</LinearLayout>
MainActivity.java
package com.simplelist;
import java.util.ArrayList;
import android.app.ListActivity;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends ListActivity {
private ArrayList<Fruit> list;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
list =new ArrayList<Fruit>();
list.add(new Fruit("Apple", R.drawable.ico_apple, 10, 5));
list.add(new Fruit("Banana", R.drawable.ico_banana, 4, 5));
list.add(new Fruit("Coconut", R.drawable.ico_coconut, 7, 10));
list.add(new Fruit("Durian", R.drawable.ico_durian, 20, 15));
list.add(new Fruit("Guava", R.drawable.ico_guava, 11, 5));
list.add(new Fruit("Mango", R.drawable.ico_mango, 10, 4));
list.add(new Fruit("Mangosteen", R.drawable.ico_mangosteen, 7, 1));
list.add(new Fruit("Rambutant", R.drawable.ico_rambutant, 6, 5));
CustomAdapter adapter = new CustomAdapter(this, R.layout.row, list);
setListAdapter(adapter);
}
@Override
public void onListItemClick(ListView lv, View v, int position, long id){
Toast.makeText(this, "You click " + list.get(position).getName(), Toast.LENGTH_SHORT).show();
}
}
Fruit.javapackage com.simplelist;
public class Fruit {
private String name;
private int image;
private int remain;
private int warning_number;
public Fruit(String name, int image, int remain, int warning_number){
this.name = name;
this.image = image;
this.remain = remain;
this.warning_number = warning_number;
}
public String getName(){return name;}
public int getImage(){return image;}
public int getRemain(){return remain;}
public boolean isLower(){return remain <= warning_number;}
}
CustomAdapter.javapackage com.simplelist;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;
public class CustomAdapter extends BaseAdapter{
private ArrayList<Fruit> mList;
private int mLayoutId;
private Context mCtx;
LayoutInflater inflater;
public CustomAdapter(Context ctx, int layoutId, ArrayList<Fruit> list){
this.mCtx = ctx;
this.mList = list;
this.mLayoutId = layoutId;
inflater = (LayoutInflater) ctx.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
}
@Override
public int getCount() {
return mList.size();
}
@Override
public Object getItem(int position) {
return mList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = inflater.inflate(mLayoutId, parent, false);
Fruit fruit = mList.get(position);
TextView tvName = (TextView) v.findViewById(R.id.name);
TextView tvNum = (TextView) v.findViewById(R.id.num);
tvName.setText(fruit.getName());
tvNum.setText(Integer.toString(fruit.getRemain()));
tvName.setCompoundDrawablesWithIntrinsicBounds(fruit.getImage(), 0, 0, 0);
if(fruit.isLower()){
v.setBackgroundColor(Color.RED);
}
return v;
}
}
ใน activity_main.xml สร้าง ListView ขึ้นมากำหนด id เป็น android:id/list เพื่อเราจะได้ extends ListActivity ใน MainActivity สร้าง ArrayList เก็บ Fruit ชื่อ list เราสร้าง class ชื่อ Fruit ขึ้นมากโดยเก็บ name, id รูปภาพ , จำนวน, เกณฑ์ขึ้นต่ำ จากนั้นก็ add fruit ใส่ใน list list = new ArrayList<Fruit>();
list.add(new Fruit("Apple", R.drawable.ico_apple, 10, 5));
list.add(new Fruit("Banana", R.drawable.ico_banana, 4, 5));
list.add(new Fruit("Coconut", R.drawable.ico_coconut, 7, 10));
list.add(new Fruit("Durian", R.drawable.ico_durian, 20, 15));
list.add(new Fruit("Guava", R.drawable.ico_guava, 11, 5));
list.add(new Fruit("Mango", R.drawable.ico_mango, 10, 4));
list.add(new Fruit("Mangosteen", R.drawable.ico_mangosteen, 7, 1));
list.add(new Fruit("Rambutant", R.drawable.ico_rambutant, 6, 5));
จากนั้น ทำการ new CustomAdapter โดย class CustomAdapter นั้น extends มาจาก BaseAdapter มี method getCount, getItem, getItemId, getView โดยเฉพาะใน method getView เราทำการนำค่าจาก object fruit ไปใส่ใน View และเช็คว่าจำนวนต่ำกว่าเกณฑ์หรือไม่ ถ้าต่ำกว่าก็ใส่พื้นหลังสีแดง @Override
public View getView(int position, View convertView, ViewGroup parent) {
View v = inflater.inflate(mLayoutId, parent, false);
Fruit fruit = mList.get(position); //get current object
TextView tvName = (TextView) v.findViewById(R.id.name);
TextView tvNum = (TextView) v.findViewById(R.id.num);
tvName.setText(fruit.getName());
tvNum.setText(Integer.toString(fruit.getRemain()));
tvName.setCompoundDrawablesWithIntrinsicBounds(fruit.getImage(), 0, 0, 0); // กำหนดรูปให้กับ textview parameter เรียงตามนี้ left, top, right, bottom เราใส่ด้านซ้ายก็ใส่ตัวแรกตัวเดียว ที่เหลือใส่ 0
if(fruit.isLower()){ // เช็คว่าต่ำกว่าหรือไม่
v.setBackgroundColor(Color.RED);
}
return v;
}
เสร็จแล้วลอง run ดูจากตัวอย่างนี้เราจะได้วิธีการแสดงผลที่มากขึ้นเพราะเราสามารถควบคุมได้มากกว่าตัวอย่างก่อนๆ ลองหาวิธีการของตัวเองดูครับว่าชอบแบบไหนแล้วใช้ให้เหมาะกับสถานการณ์
