Để 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, List list, ClickEvent handle] {super[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 title 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 list;
private final Activity context;
private ClickEvent clickEvent;
public ListviewAdapter[Activity context, List list, ClickEvent handle] {
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 title 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 listData;
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:
Quận 1
Quận 2
Quận 3
Quận 4
Quận 5
Quận 6
Quận 7
Quận 8
Quận 9
Quận 10
Quận 11
Quận 12
Quận Gò Vấp
Quận Bình Thạnh
Quận Tân Bình
Quận Bình Tân
Quận Tân Phú
Quận Phú Nhuận
Tp. Thủ Đức
Huyện Bình Chánh
Huyện Cần Giờ
Huyện Củ Chi
Huyện Nhà Bè
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
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 dictrictList = new LinkedList[Arrays.asList[getResources[].getStringArray[R.array.DataShowListview]]];
}
Bước 5: Tạo một ArrayAdapter
private class StableArrayAdapter extends ArrayAdapter {HashMap mIdMap = new HashMap[];
public StableArrayAdapter[Context context, int textViewResourceId,
List objects] {
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 dictrictList = new LinkedList[Arrays.asList[getResources[].getStringArray[R.array.DataShowListview]]];
// 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 mIdMap = new HashMap[];
public StableArrayAdapter[Context context, int textViewResourceId,
List objects] {
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:Tại đây
Link 2:Tại đây
Bước 9: Link full code của demo:Tại đây