Tìm hiểu ArrayAdapter hiển thị dữ liệu lên ListView

Trong bài này ta sẽ thiết kế một ứng dụng như sau

Giao diện trên chỉ có 1 ListView để chứa danh sách các mặt hàng
Mỗi dòng (Item) của ListView cũng được coi như là 1 View
Trong View có chứa 3 TextView
Để đổ dữ liệu vào 3 TextView của mỗi Item ta sử dụng ArrayAdapter

Chúng ta bắt đầu tạo ứng dụng:
Tạo mới ứng dụng có tên là Sales. Cấu trúc Project sẽ như sau:

Class Product
Class này có 3 thuộc tính là ProductName, Unit và Price, cùng các setter và getter
Product.java
Product.java

package com.androidtmc.sales.models; 
 
/** 
 * Created by minhc_000 on 09/08/2015. 
 */ 
public class Product { 
    private String ProductName; 
    private String Unit; 
 
    private double Price; 
    public Product() { 
        ProductName = ""; 
        Unit = ""; 
        Price = 0; 
    } 
 
    public Product(String pname, String unit, double price) { 
        ProductName = pname; 
        Unit = unit; 
        Price = price; 
    } 
 
    public String getProductName() { 
        return ProductName; 
    } 
 
    public void setProductName(String productName) { 
        ProductName = productName; 
    } 
 
    public String getUnit() { 
        return Unit; 
    } 
 
    public void setUnit(String unit) { 
        Unit = unit; 
    } 
 
    public double getPrice() { 
        return Price; 
    } 
 
    public void setPrice(double price) { 
        Price = price; 
    } 
} 
Class SaleManager
SaleManager.java
SaleManager.java

package com.androidtmc.sales.models; 
 
import java.util.ArrayList; 
 
/** 
 * Created by minhc_000 on 12/08/2015. 
 */ 
public class SaleManager { 
    private ArrayList Products; 
 
    public SaleManager() { 
        Products = new ArrayList(); 
    } 
 
    public ArrayList getProducts() { 
        return Products; 
    } 
 
    public void setProducts(ArrayList products) { 
        Products = products; 
    } 
 
    public void generateProducts() { 
        Products.clear(); 
        Products.add(new Product("Socola KitKat", "Gói", 42000)); 
        Products.add(new Product("Kẹo dẻo Jelly Bean", "Hộp", 50000)); 
        Products.add(new Product("Bánh kem Icecream Sandwich", "Que", 2000)); 
        Products.add(new Product("Mật ong rừng HoneyComb", "Hũ", 60000)); 
        Products.add(new Product("Bánh mì gừng GingerBread", "Ổ", 10000)); 
    } 
 
    private static SaleManager saleManager; 
 
    public static SaleManager get() { 
        if (saleManager == null) 
            saleManager = new SaleManager(); 
        return saleManager; 
    } 
} 

Class này quản lý danh sách các sản phẩm ta có dùng một danh sách ArrayList. Qua class này cũng giới thiệu một khái niệm mới là khái niệm singleton. Singleton cho phép thiết lập một đối tượng toàn cục duy nhất và cho phép sử dụng đối tượng này từ bất cứ chỗ nào trong chương trình. Ứng dụng Android của chúng ta có 2 activity (activity quản lý danh sách sản phẩm và activity chỉnh sửa một sản phẩm). Việc sử dụng singleton giúp 2 activity có thể độc lập truy xuất mô hình dữ liệu.

private static SaleManager saleManager;
public static SaleManager get() {
    if (saleManager == null)
        saleManager = new SaleManager();
    return saleManager;
}

Singleton sử dụng một biến static (đối tượng toàn cục) và một hàm static get(). Hàm này khởi tạo đối tượng cục nếu nó chưa được khởi tạo. Từ bất cứ chỗ nào cũng có thể truy xuất hàm get() để lấy được đối tượng toàn cục này. Ta sẽ xem các sử dụng singleton ở phần sau. Ngoài ra trong class này ta khai báo hàm generateProducts để khởi tạo một số dữ liệu mẫu.

Thiết kế giao diện cho màng hình chính
Màng hình chính chỉ có 1 ListView nên ta sửa như sau (trong file activity_main.xml)
activity_main.xml
activity_main.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" 
    android:orientation="vertical"> 
    <ListView 
        android:id="@+id/lvProducts" 
        android:layout_width="match_parent" 
        android:layout_height="wrap_content"></ListView> 
</LinearLayout>


Adapter Cho Listview

ProductAdapter.java
ProductAdapter.java

package com.androidtmc.sales.Adapter; 
 
import android.app.Activity; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 
 
import com.androidtmc.sales.R; 
import com.androidtmc.sales.models.Product; 
 
import java.text.DecimalFormat; 
import java.util.ArrayList; 
 
/** 
 * Created by minhc_000 on 12/08/2015. 
 */ 
public class ProductAdapter  extends ArrayAdapter { 
    Activity activity;//activity chứa listview 
    public ProductAdapter(Activity activity, ArrayList products) { 
        super(activity, 0, products); 
        this.activity = activity; 
    } 
 
    //hàm hiện thị từng item lên listview 
    public View getView(int position, View convertView, ViewGroup viewGroup) 
    { 
        //position là vị tri của mỗi item. nó sẽ chạy hết mảng 
        //lấy layout cho từng item 
        if (convertView == null) 
        { 
            LayoutInflater inflater = activity.getLayoutInflater(); 
            convertView = inflater.inflate(R.layout.listitem_product, null); 
        } 
        //lấy các textview trong mỗi view 
        TextView tvProductName = (TextView)convertView 
                .findViewById(R.id.tvProductName); 
        TextView tvUnit = (TextView)convertView.findViewById(R.id.tvUnit); 
        TextView tvPrice = (TextView)convertView 
                .findViewById(R.id.tvPrice); 
        //hiển thị dư liệu lên từng item của listview ở vị trí position 
        Product p = getItem(position); 
        tvProductName.setText(p.getProductName()); 
        tvUnit.setText(p.getUnit()); 
        String s = (new DecimalFormat("#,###.##")).format(p.getPrice()); 
        tvPrice.setText(s); 
        return convertView;//trả về 1 view khi đã thiết đặt xong 
    } 
} 


Hiển thị lên màng hình
Ta chỉnh sửa trong MainActivity.java
MainActivity.java
MainActivity.java

package com.androidtmc.sales; 
 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.widget.ListView; 
 
import com.androidtmc.sales.Adapter.ProductAdapter; 
import com.androidtmc.sales.models.SaleManager; 
 
import java.util.ArrayList; 
 
public class MainActivity extends AppCompatActivity { 
    ListView lv; 
    ProductAdapter adapter; 
    @Override 
 
    protected void onCreate(Bundle savedInstanceState) { 
 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.activity_main); 
        lv = (ListView) findViewById(R.id.lvProducts); 
        //Khởi tạo các sản phẩm 
        SaleManager saleManager = SaleManager.get(); 
        saleManager.generateProducts(); 
 
        //lấy các product từ class saleManager 
        ArrayList products = saleManager.getProducts(); 
        adapter = new ProductAdapter(this, products);//khởi tạo adapter 
        lv.setAdapter(adapter);//hiển lên listview 
    } 
 
    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
        // Inflate the menu; this adds items to the action bar if it is present. 
        getMenuInflater().inflate(R.menu.menu_main, menu); 
        return true; 
    } 
 
    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
        // Handle action bar item clicks here. The action bar will 
        // automatically handle clicks on the Home/Up button, so long 
        // as you specify a parent activity in AndroidManifest.xml. 
        int id = item.getItemId(); 
 
        //noinspection SimplifiableIfStatement 
        if (id == R.id.action_settings) { 
            return true; 
        } 
 
        return super.onOptionsItemSelected(item); 
    } 
} 
Source code
Bài tiếp theo: Thêm sửa xóa item trong ListView
SHARE

GivesTech

  • Image
  • Image
  • Image
  • Image
  • Image
    Blogger Comment
    Facebook Comment

1 nhận xét: