Tối ưu ListView với Viewholder trong lập trình ứng dụng android.

Chào các Bạn. Hiện nay có rất nhiều Bạn học lập trình ứng dụng android, và ắt hẳn một ngày nào đó Bạn sẽ sử dụng ListView. và hiện nay trên các forum như Cộng đồng lập trình android việt nam hay các group facebook có rất nhiều thành viên than phiền vì tốc độ scroll quá chậm. vì vậy nên mình sẽ viết cho các Bạn bài này để hướng dẫn các Bạn tối ưu listview với Viewholder.
ViewHolder là một phần quan trọng cuối cùng trong listview các Bạn cần phải biết. Với ViewHolder sẽ giúp các Bạn tối ưu listview hơn bằng cách giản thiểu mức tối số lần findviewbyid. và cũng như sẽ giúp các Bạn tùy chỉnh một View theo ý riêng của Bạn.

Khi sử dụng ViewHolder các Bạn cần phải chú ý đến 2 phương thức đó là getTag(), và setTag() .
Mục để giải thích 2 phương thức này thì mình sẽ nói như thế này, mục đích mà mình phải sử dụng ViewHolder là lưu lại Tất cả các giá trị trong một view trên một dòng của ListView hay một view nào đó nên khi mình sử dụng setTag() là mình sẽ lưu lại các giá trị của view đó, và khi nào cần chỉ cần gọi getTag();

Nào bây giờ mời các Bạn cùng vào code với mình nhé. Đầu tiên các Bạn hãy tạo cho mình một listview custom. và trong Adapter có code cụ thể ví dụ của mình ở đây.

Adapter  Mình có tên là SinhVienAdapter.java


package com.example.letublogger.viewholderinandroid;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.ArrayList;

/** * Created by Le Tu Blogger on 12/6/2015. */public class SinhVienAdapter extends ArrayAdapter<SinhVien> {
    Context context;
    public SinhVienAdapter(Context context, int resource, ArrayList<SinhVien> objects) {
        super(context, resource, objects);
        this.context = context;
    }

    @Override    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder viewHolder;
        SinhVien sv = getItem(position);
        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.layout_item, null);
            viewHolder = new ViewHolder();
            viewHolder.textName = (TextView) convertView.findViewById(R.id.textName);
            viewHolder.textMssv = (TextView) convertView.findViewById(R.id.textMssv);
            viewHolder.avt = (ImageView) convertView.findViewById(R.id.imageView);
            convertView.setTag(viewHolder);
        }else {
            viewHolder = (ViewHolder) convertView.getTag();
        }
        viewHolder.textName.setText(sv.getTen());
        viewHolder.textMssv.setText(sv.getMSSV());
        viewHolder.avt.setImageResource(sv.getAvt());

        return convertView;
    }
    class ViewHolder{
        TextView textName;
        TextView textMssv;
        ImageView avt;
        public ViewHolder(){

        }
    }
}

Bên MainActivity.java mình code như sau
package com.example.letublogger.viewholderinandroid;

import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ArrayAdapter;
import android.widget.ListView;

import java.util.ArrayList;

public class MainActivity extends AppCompatActivity {
    ListView mList;
    ArrayAdapter adapter;
    @Override    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        mList = (ListView) findViewById(R.id.listview);
        ArrayList<SinhVien> arrayList = new ArrayList<SinhVien>();
        arrayList.add(new SinhVien("Nguyen A","MSSV:01", R.drawable.a));
        arrayList.add(new SinhVien("Nguyen B","MSSV:02", R.drawable.b));
        arrayList.add(new SinhVien("Nguyen C","MSSV:03", R.drawable.c));
        arrayList.add(new SinhVien("Nguyen D","MSSV:04", R.drawable.d));
        arrayList.add(new SinhVien("Nguyen E","MSSV:05", R.drawable.a));
        adapter = new SinhVienAdapter(this, 0, arrayList);
        mList.setAdapter(adapter);

    }
}

Như vậy là xong, với video mình quay có một số sơ xuất nên các Bạn đọc bài viết nha. cảm ơn các Bạn rất nhiều.

Comments

Post a Comment

Popular posts from this blog

Cách custom bo tròn cạnh imageView trong android

Lập trình android: Hiệu ứng khi xóa một item ra khỏi listview