Base Adapter
TIL
589
android
43
Male avatar

Hades viết ngày 31/03/2017

BaseAdapter

Trong android, Adapter là cầu nối giữa thành phần giao diện người dùng và và nguồn dữ liệu giúp ta có thể điền dữ liệu vào thành phần UI. Giờ cùng tìm hiểu về BaseAdapter.
BaseAdapter là một lớp cơ sở chung đối với việc triển khai một adapter có thể được sử dụng ListView, GridView, Spinner.. .

Khi tôi tạo 1 lớp adapter extends BaseAdapter nó có dạng thế này :

public class CustomAdapter extends BaseAdapter {
    @Override
    public int getCount() {
        return 0;
    }

    @Override
    public Object getItem(int i) {
        return null;
    }

    @Override
    public long getItemId(int i) {
        return 0;
    }

    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        return null;
    }
}

Giá trị cần trả về trong các phương thức :

getCount()

Data ta muốn đổ lên view cần phải có số lượng cụ thể, vì vậy cần trả về số lượng các "dòng" data cần đổ. Ví dụ :

@Override
public int getCount() {
    return mList.size();
}

getItem(int i)

Phương thức này được sử dụng để lấy dữ liệu tại ví trị xác định trong tập dữ liệu của ta.
Bên dưới là một ví dụ mà ta 1 item trong arraylist dựa trên vị trí của nó.

@Override
public Object getItem(int i) {
    return arrayList.get(i);
}

getItemId(int i)

Hàm trả về giá trị kiểu long ví trí item trong adapter. Ví dụ :

@Override
public long getItemId(int i) {
        return i;
}

getView(int i, View view, ViewGroup viewGroup)

Phương thức này tự động được gọi khi list item view sẵn sàng được hiển thị hoặc gần được hiển thị. Trong phương thức này ta set layout cho danh sách các item sử dụng lớp LayoutInflater sau đó thêm dữ liệu vào view như ImageView, TextView.. .
Dưới đây là một ví dụ :

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    if(view == null ) {
        view = LayoutInflater.from(mContext).inflate(R.layout.activity_gridview, null);//set layout for displaying items
    }
    TextView txtName = (TextView) view.findViewById(R.id.txtName);
    TextView txtEmail = (TextView) view.findViewById(R.id.txtEmail);

    return view;
}

Có một vấn đề ta cần tìm hiểu khi sử dụng cách getView như trên đó là có một số lỗi xảy ra như đơ hoặc là crash app khi dữ liệu của bạn rất lớn. Bởi mỗi khi được getView ta lại phải gọi findViewById() trên mọi tài nguyên. Để tránh điều này ta sử dụng một lớp gọi là ViewHolder.

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder = null;
        if (convertView == null) {
            convertView = LayoutInflater.from(mContext).inflate(R.layout.layout_list_item, null);

            holder = new ViewHolder();
            holder.txtName = (TextView) convertView.findViewById(R.id.txtName);
            holder.txtMail = (TextView) convertView.findViewById(R.id.txtMail);

            convertView.setTag(holder);
        }
        Contact entry = mList.get(position);
        holder = (ViewHolder) convertView.getTag();
        holder.txtName.setText(entry.getName());
        holder.txtMail.setText(entry.getMail());

        return convertView;
    }

    static class ViewHolder {
        TextView txtName;
        TextView txtMail;
    }

Bình luận


White
{{ comment.user.name }}
Bỏ hay Hay
{{comment.like_count}}
Male avatar
{{ comment_error }}
Hủy
   

Hiển thị thử

Chỉnh sửa

Male avatar

Hades

5 bài viết.
16 người follow
Kipalog
{{userFollowed ? 'Following' : 'Follow'}}
Cùng một tác giả
Male avatar
9 12
Dưới đây là một cách tổ chức thư mục mà mình cho là khá hợp lý. Hi vọng mọi người có thể tham khảo và góp ý :smile: Android_structure ├─ com.abc ...
Hades viết hơn 1 năm trước
9 12
Male avatar
5 2
Những điều cần nhớ Hades 22042017 Đừng dùng lại Đừng sử dụng lại strings cho nhiều màn hình khác nhau. 1. Tưởng tượng rằng bạn có một hộp thoạ...
Hades viết 1 năm trước
5 2
Male avatar
4 0
Giới thiệu RecycleView là một viewGroup mới được giới thiệu trong Android L ( API 21 ). Đây là một viewGroup có chức năng tương tự như ListView nh...
Hades viết hơn 1 năm trước
4 0
Bài viết liên quan
White
8 4
Ở bài viết lần trước](), tôi đã nói về "hoàn cảnh" tại sao tôi lại cần sử dụng openssl trên android native, đồng thời cũng đã giới thiệu qua về các...
huydx viết hơn 3 năm trước
8 4
White
7 0
Gradle là gì? Sao lại xử dụng Gradle trong Android? Sử dụng Gradle như thế nào? Đó là một trong rất nhiều câu hỏi mà các Android developer mới làm ...
khoatd92 viết 1 năm trước
7 0
{{like_count}}

kipalog

{{ comment_count }}

bình luận

{{liked ? "Đã kipalog" : "Kipalog"}}


Male avatar
{{userFollowed ? 'Following' : 'Follow'}}
5 bài viết.
16 người follow

 Đầu mục bài viết

Vẫn còn nữa! x

Kipalog vẫn còn rất nhiều bài viết hay và chủ đề thú vị chờ bạn khám phá!