Bắt sự kiện cho ListView trong Android
Để cái hình cho mọi người biết là mình tiếp tục bài listview. Những phần thiếu sót trong bài 6 mình sẽ bổ sung ở bài 7 này luôn và thêm một cái mới nữa là mình dùng listview với một adapter đã có sẵn trong hệ thống của android để thực hiện load data lên Listview. ****** Và mình sẽ bắt đầu giải quyết phần thiếu sót của bài 6 trước: bắt event click hoặc longpress trên item của listview.****** Bước 1: Vào trong file layout của viewItem thêm id cho LinearLayout làitem_view_event_catch Bước 2: Thêm một interface bên trong class ListviewAdapter như sau: public interface ClickEvent{// sự kiện item click public void itemClick(int itemIndex); // sự kiện long click public void itemLongPress(int itemIndex); } Khai báo thêm một biến clickEvent để quăng các sự kiện ra ngoài clan MainActivity để xử lý cho dễ. private ClickEvent clickEvent;Sữa lại phần khởi tạo của adapter public ListviewAdapter(Activity context, Listsuper(context, R.layout.view_item, list); this.context = context; this.list = list; this.clickEvent = handle; } Thêm 2 phương thức để bắt sự kiện click trong mỗi item view và quăng ra ngoài main để xử lý // set sự kiện onclick cho itemholder.itemViewCatchEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clickEvent.itemClick(position); } }); // set sự kiện long press cho item holder.itemViewCatchEvent.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { clickEvent.itemLongPress(position); return false; } }); Và đây là toàn bộ class Adaper của chúng ta: package com.tnv.thongcodelab_listview;import android.app.Activity; 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.LinearLayout; import android.widget.TextView; import androidx.annotation.NonNull; import java.util.Collections; import java.util.List; public class ListviewAdapter extends ArrayAdapter public interface ClickEvent{ // sự kiện item click public void itemClick(int itemIndex); // sự kiện long click public void itemLongPress(int itemIndex); } private final List private final Activity context; private ClickEvent clickEvent; public ListviewAdapter(Activity context, List super(context, R.layout.view_item, list); this.context = context; this.list = list; this.clickEvent = handle; } // đây là class giữ lại giá trị của item view khi hoạt động scroll Listview xảy ra static class ViewHolder { // image avatar protected ImageView imgAvatar; // họ và tên protected TextView txtName; // chức vụ protected TextView txtPosition; // số điện thoại protected TextView txtPhoneNumber; // trạng thái làm việc protected TextView txtIsWorking; // nơi bắt sự kiện click hay long click protected LinearLayout itemViewCatchEvent; } // phương thức binding data vào view @Override public View getView(int position, View convertView, ViewGroup parent) { View view = null; if (convertView == null) { LayoutInflater inflator = context.getLayoutInflater(); view = inflator.inflate(R.layout.view_item, null); final ViewHolder viewHolder = new ViewHolder(); viewHolder.imgAvatar = view.findViewById(R.id.img_ite_avatar); viewHolder.txtName = view.findViewById(R.id.txt_ite_name); viewHolder.txtPosition = view.findViewById(R.id.txt_ite_position); viewHolder.txtPhoneNumber = view.findViewById(R.id.txt_ite_phone_number); viewHolder.txtIsWorking = view.findViewById(R.id.txt_ite_isWorking); viewHolder.itemViewCatchEvent = view.findViewById(R.id.item_view_event_catch); view.setTag(viewHolder); } else { view = convertView; } ViewHolder holder = (ViewHolder) view.getTag(); holder.imgAvatar.setImageResource(list.get(position).getAvatar()); holder.txtName.setText(list.get(position).getHoVaTen()); holder.txtPosition.setText(list.get(position).getPosition()); holder.txtPhoneNumber.setText(list.get(position).getPhoneNumber()); holder.txtIsWorking.setText(list.get(position).getIsWorking()); // set sự kiện onclick cho item holder.itemViewCatchEvent.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { clickEvent.itemClick(position); } }); // set sự kiện long press cho item holder.itemViewCatchEvent.setOnLongClickListener(new View.OnLongClickListener() { @Override public boolean onLongClick(View v) { clickEvent.itemLongPress(position); return false; } }); return view; } } Bước 3: Trong class MainActivity mình implements thêm interface đã tạo trong adapter Implements thêm 2 hàm sau trong class MainActivity @Overridepublic void itemClick(int itemIndex) { Toast.makeText(this,"Index: " + itemIndex, Toast.LENGTH_SHORT).show(); } @Override public void itemLongPress(int itemIndex) { Toast.makeText(this, "Longpresss index:" + itemIndex, Toast.LENGTH_LONG).show(); } Như vậy class MainActivity của mình đã hoàn thiện như sau: package com.tnv.thongcodelab_listview;import androidx.appcompat.app.AppCompatActivity; import android.os.Bundle; import android.widget.ListView; import android.widget.Toast; import java.util.ArrayList; import java.util.List; public class MainActivity extends AppCompatActivity implements ListviewAdapter.ClickEvent { // adapter private ListviewAdapter adapter; private List private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // khai báo view cho màn hình chính, listview listView = findViewById(R.id.list_view); // load data vaof listData trước loadData(); // khởi tạo adapter adapter = new ListviewAdapter(this, listData, this); // set adapter vào listview listView.setAdapter(adapter); } // hàm này gán data vào list để nạp vào listview và load trên giao diện private void loadData(){ listData = new ArrayList<>(); // tạo ra 14 đối tượng nhân viên, // ở đây mình demo cho các bạn mới bắt đầu làm quen với data // nên mới có cách làm thủ công này, chứ thực tế // load dữ liệu từ webservice là xong ItemModel itemModel1 = new ItemModel(); itemModel1.setAvatar(R.drawable.img1); itemModel1.setHoVaTen("Nguyễn Văn ABB"); itemModel1.setPosition("Thư ký"); itemModel1.setPhoneNumber("0124 210 124"); itemModel1.setIsWorking("Nghỉ phép"); listData.add(itemModel1); ItemModel itemModel2 = new ItemModel(); itemModel2.setAvatar(R.drawable.img2); itemModel2.setHoVaTen("Nguyễn Văn Schneider"); itemModel2.setPosition("Nhân viên IT"); itemModel2.setPhoneNumber("0124 210 124"); itemModel2.setIsWorking("Đang làm việc"); listData.add(itemModel2); ItemModel itemModel3 = new ItemModel(); itemModel3.setAvatar(R.drawable.img3); itemModel3.setHoVaTen("Nguyễn Văn Mitsubishi"); itemModel3.setPosition("Chăm sóc khách hàng"); itemModel3.setPhoneNumber("0796 111 247"); itemModel3.setIsWorking("Đang làm việc"); listData.add(itemModel3); ItemModel itemModel4 = new ItemModel(); itemModel4.setAvatar(R.drawable.img4); itemModel4.setHoVaTen("Nguyễn Văn LS"); itemModel4.setPosition("CEO"); itemModel4.setPhoneNumber("0975 111 355"); itemModel4.setIsWorking("Đang làm việc"); listData.add(itemModel4); ItemModel itemModel5 = new ItemModel(); itemModel5.setAvatar(R.drawable.img5); itemModel5.setHoVaTen("Nguyễn Văn Panasonic"); itemModel5.setPosition("Nhân viên kho"); itemModel5.setPhoneNumber("0542 552 333"); itemModel5.setIsWorking("Đang làm việc"); listData.add(itemModel5); ItemModel itemModel6 = new ItemModel(); itemModel6.setAvatar(R.drawable.img6); itemModel6.setHoVaTen("Nguyễn Văn Toshiba"); itemModel6.setPosition("Nhân viên kho"); itemModel6.setPhoneNumber("0111 222 333"); itemModel6.setIsWorking("Đang làm việc"); listData.add(itemModel6); ItemModel itemModel7 = new ItemModel(); itemModel7.setAvatar(R.drawable.img7); itemModel7.setHoVaTen("Nguyễn Văn Omron"); itemModel7.setPosition("Thủ kho"); itemModel7.setPhoneNumber("0654 889 554"); itemModel7.setIsWorking("Đang làm việc"); listData.add(itemModel7); ItemModel itemModel8 = new ItemModel(); itemModel8.setAvatar(R.drawable.img8); itemModel8.setHoVaTen("Nguyễn Văn Meanwell"); itemModel8.setPosition("Kế toán"); itemModel8.setPhoneNumber("0995 44 55 77"); itemModel8.setIsWorking("Đang làm việc"); listData.add(itemModel8); ItemModel itemModel9 = new ItemModel(); itemModel9.setAvatar(R.drawable.img9); itemModel9.setHoVaTen("Nguyễn Văn Phonix Contact"); itemModel9.setPosition("Bán hàng"); itemModel9.setPhoneNumber("0548 22 22 23"); itemModel9.setIsWorking("Đang làm việc"); listData.add(itemModel9); ItemModel itemModel10 = new ItemModel(); itemModel10.setAvatar(R.drawable.img10); itemModel10.setHoVaTen("Nguyễn Văn Wago"); itemModel10.setPosition("Kỹ sư"); itemModel10.setPhoneNumber("0223 254 889"); itemModel10.setIsWorking("Onsite"); listData.add(itemModel10); ItemModel itemModel11 = new ItemModel(); itemModel11.setAvatar(R.drawable.img11); itemModel11.setHoVaTen("Nguyễn Văn Klemsan"); itemModel11.setPosition("SEO"); itemModel11.setPhoneNumber("0945 888 883"); itemModel11.setIsWorking("Đang làm việc"); listData.add(itemModel11); ItemModel itemModel12 = new ItemModel(); itemModel12.setAvatar(R.drawable.img12); itemModel12.setHoVaTen("Nguyễn Văn Pentax"); itemModel12.setPosition("SEO"); itemModel12.setPhoneNumber("0139 554 124"); itemModel12.setIsWorking("Thực địa"); listData.add(itemModel12); ItemModel itemModel13 = new ItemModel(); itemModel13.setAvatar(R.drawable.img13); itemModel13.setHoVaTen("Nguyễn Văn Ebara"); itemModel13.setPosition("Kỹ sư"); itemModel13.setPhoneNumber("0124 578 966"); itemModel13.setIsWorking("Làm dự án"); listData.add(itemModel13); ItemModel itemModel14 = new ItemModel(); itemModel14.setAvatar(R.drawable.img14); itemModel14.setHoVaTen("Nguyễn Văn Hasaki"); itemModel14.setPosition("Bán hàng"); itemModel14.setPhoneNumber("0124 458 887"); itemModel14.setIsWorking("Đang làm việc"); listData.add(itemModel14); } @Override public void itemClick(int itemIndex) { Toast.makeText(this,"Index: " + itemIndex, Toast.LENGTH_SHORT).show(); } @Override public void itemLongPress(int itemIndex) { Toast.makeText(this, "Longpresss index:" + itemIndex, Toast.LENGTH_LONG).show(); } } Bước 4: Thưởng thức thành quả Bước 5: Link tải code:Tại đây ------------------Hết phần bổ sung bài 6----------------------------- Nội dung trọng tâm ở bài này là sử dụng listview với adpater mà hệ thống cung cấp và bắt các sự kiện có sẵn của listview Bước 1: Tạo project, như các bước có trong các bài học trước. Đặt tên là ThongCodeLab_LWAdapter (nghĩa là listview không xử dụng adapter) Bước 2: Sau khi tạo project xong vào phần resource mở file strings.xml giống như hình Về ý nghĩa và cách dùng cụ thể của file strings.xml bạn sẽ có phần link tham khảo ở cuối bài. Tiếp theo bạn tạo một string-array có tên là DataShowListview như sau:<string-array name="DataShowListview"> <item>Quận 1item> <item>Quận 2item> <item>Quận 3item> <item>Quận 4item> <item>Quận 5item> <item>Quận 6item> <item>Quận 7item> <item>Quận 8item> <item>Quận 9item> <item>Quận 10item> <item>Quận 11item> <item>Quận 12item> <item>Quận Gò Vấpitem> <item>Quận Bình Thạnhitem> <item>Quận Tân Bìnhitem> <item>Quận Bình Tânitem> <item>Quận Tân Phúitem> <item>Quận Phú Nhuậnitem> <item>Tp. Thủ Đứcitem> <item>Huyện Bình Chánhitem> <item>Huyện Cần Giờitem> <item>Huyện Củ Chiitem> <item>Huyện Nhà Bèitem> string-array> Bước 3: Mở file activity_main.xml ra thêm listview vào như hình Code của Listview xml trong file layout<ListView android:layout_width="match_parent" android:layout_height="match_parent" android:id="@+id/list_item" android:dividerHeight="2dp" android:background="#ebebeb" android:divider="@color/teal_700"/> Bước 4: Mở file code MainActivity.java ra khai báo listview và tạo một list string[] từ string-array trong file strings.xml private ListView listView;@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // khai báo khởi tạo listview listView = findViewById(R.id.list_item); // load dữ liệu vào mảng từ file strings.xml List } Bước 5: Tạo một ArrayAdapter private class StableArrayAdapter extends ArrayAdapterHashMap public StableArrayAdapter(Context context, int textViewResourceId, List super(context, textViewResourceId, objects); for (int i = 0; i < objects.size(); ++i) { mIdMap.put(objects.get(i), i); } } @Override public long getItemId(int position) { String item = getItem(position); return mIdMap.get(item); } @Override public boolean hasStableIds() { return true; } } Bước 6: Triển khai adapter load data vào listview // khởi tạo adapter và gán vào listviewfinal StableArrayAdapter adapter = new StableArrayAdapter(this, android.R.layout.simple_list_item_1, dictrictList); listView.setAdapter(adapter); // chổ này bắt sự kiện click vào item trong listview, mình làm mỗi click là xóa một item cho bạn dễ hình dung listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, final View view, int position, long id) { final String item = (String) parent.getItemAtPosition(position); view.animate().setDuration(300).alpha(0).withEndAction(new Runnable() { @Override public void run() { dictrictList.remove(position); adapter.notifyDataSetChanged(); view.setAlpha(1); } }); } }); Full code của file MainActivity.java như sau: (Từ bài 11 trở đi trong code những đoạn comment sẽ là 100% tiếng anh nhé. comment tiếng Việt thấy không đúng nghiệp vụ mà khó diễn tả, khiến người đọc có thể hiểu sai nghĩa thực sự của hàm hoặc của các method, kiểu dữ liệu) import androidx.appcompat.app.AppCompatActivity; import android.content.Context; import android.os.Bundle; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.ListView; import java.util.ArrayList; import java.util.Arrays; import java.util.HashMap; import java.util.LinkedList; import java.util.List; public class MainActivity extends AppCompatActivity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // khai báo khởi tạo listview listView = findViewById(R.id.list_item); // load dữ liệu vào mảng từ file strings.xml List // khởi tạo adapter và gán vào listview final StableArrayAdapter adapter = new StableArrayAdapter(this, android.R.layout.simple_list_item_1, dictrictList); listView.setAdapter(adapter); // chổ này bắt sự kiện click vào item trong listview, mình làm mỗi click là xóa một item cho bạn dễ hình dung listView.setOnItemClickListener(new AdapterView.OnItemClickListener() { @Override public void onItemClick(AdapterView parent, final View view, int position, long id) { final String item = (String) parent.getItemAtPosition(position); view.animate().setDuration(300).alpha(0).withEndAction(new Runnable() { @Override public void run() { dictrictList.remove(position); adapter.notifyDataSetChanged(); view.setAlpha(1); } }); } }); } private class StableArrayAdapter extends ArrayAdapter HashMap public StableArrayAdapter(Context context, int textViewResourceId, List super(context, textViewResourceId, objects); for (int i = 0; i < objects.size(); ++i) { mIdMap.put(objects.get(i), i); } } @Override public long getItemId(int position) { String item = getItem(position); return mIdMap.get(item); } @Override public boolean hasStableIds() { return true; } } } Bước 7: Thưởng thức kết quả Bước 8: Link tham khảo thêm: - Khái niệm và hiểu rõ hơn bản chất của file strings.xml Link 1:Tại đây Link 2:Tại đây Link 3:Tại đây - Sử dụng adpater hệ thống, chuyển đổi string-array thành List Link 2:Tại đây Bước 9: Link full code của demo:Tại đây Gửi email bài đăng nàyBlogThis!Chia sẻ lên TwitterChia sẻ lên Facebook
|