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 kin item click
public void itemClick[int itemIndex];

// s kin 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 kin title cho item
holder.itemViewCatchEvent.setOnClickListener[new View.OnClickListener[] {
@Override
public void onClick[View v] {
clickEvent.itemClick[position];
}
}];

// set s kin 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 kin item click
public void itemClick[int itemIndex];

// s kin 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 li giá tr ca item view khi hot đng scroll Listview xy ra
static class ViewHolder {
// image avatar
protected ImageView imgAvatar;

// h và tên
protected TextView txtName;

// chc v
protected TextView txtPosition;

// s đin thoi
protected TextView txtPhoneNumber;

// trng thái làm vic
protected TextView txtIsWorking;

// nơi bt s kin click hay long click
protected LinearLayout itemViewCatchEvent;
}

// phương thc 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 kin title cho item
holder.itemViewCatchEvent.setOnClickListener[new View.OnClickListener[] {
@Override
public void onClick[View v] {
clickEvent.itemClick[position];
}
}];

// set s kin 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 ListviewAdapter.ClickEvent

Implements thêm 2 hàm sau trong class MainActivity

@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[];
}

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[];

// khi to 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 đ np vào listview và load trên giao din
private void loadData[]{

listData = new ArrayList[];

// to ra 14 đi tượng nhân viên,
// đây mình demo cho các bn mi bt đu làm quen vi data
// nên mi có cách làm th công này, ch thc tế
// load d liu t webservice là xong
ItemModel itemModel1 = new ItemModel[];
itemModel1.setAvatar[R.drawable.img1];
itemModel1.setHoVaTen["Nguyn 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["Nguyn Văn Schneider"];
itemModel2.setPosition["Nhân viên IT"];
itemModel2.setPhoneNumber["0124 210 124"];
itemModel2.setIsWorking["Đang làm vic"];
listData.add[itemModel2];

ItemModel itemModel3 = new ItemModel[];
itemModel3.setAvatar[R.drawable.img3];
itemModel3.setHoVaTen["Nguyn Văn Mitsubishi"];
itemModel3.setPosition["Chăm sóc khách hàng"];
itemModel3.setPhoneNumber["0796 111 247"];
itemModel3.setIsWorking["Đang làm vic"];
listData.add[itemModel3];

ItemModel itemModel4 = new ItemModel[];
itemModel4.setAvatar[R.drawable.img4];
itemModel4.setHoVaTen["Nguyn Văn LS"];
itemModel4.setPosition["CEO"];
itemModel4.setPhoneNumber["0975 111 355"];
itemModel4.setIsWorking["Đang làm vic"];
listData.add[itemModel4];

ItemModel itemModel5 = new ItemModel[];
itemModel5.setAvatar[R.drawable.img5];
itemModel5.setHoVaTen["Nguyn Văn Panasonic"];
itemModel5.setPosition["Nhân viên kho"];
itemModel5.setPhoneNumber["0542 552 333"];
itemModel5.setIsWorking["Đang làm vic"];
listData.add[itemModel5];

ItemModel itemModel6 = new ItemModel[];
itemModel6.setAvatar[R.drawable.img6];
itemModel6.setHoVaTen["Nguyn Văn Toshiba"];
itemModel6.setPosition["Nhân viên kho"];
itemModel6.setPhoneNumber["0111 222 333"];
itemModel6.setIsWorking["Đang làm vic"];
listData.add[itemModel6];

ItemModel itemModel7 = new ItemModel[];
itemModel7.setAvatar[R.drawable.img7];
itemModel7.setHoVaTen["Nguyn Văn Omron"];
itemModel7.setPosition["Th kho"];
itemModel7.setPhoneNumber["0654 889 554"];
itemModel7.setIsWorking["Đang làm vic"];
listData.add[itemModel7];

ItemModel itemModel8 = new ItemModel[];
itemModel8.setAvatar[R.drawable.img8];
itemModel8.setHoVaTen["Nguyn Văn Meanwell"];
itemModel8.setPosition["Kế toán"];
itemModel8.setPhoneNumber["0995 44 55 77"];
itemModel8.setIsWorking["Đang làm vic"];
listData.add[itemModel8];

ItemModel itemModel9 = new ItemModel[];
itemModel9.setAvatar[R.drawable.img9];
itemModel9.setHoVaTen["Nguyn Văn Phonix Contact"];
itemModel9.setPosition["Bán hàng"];
itemModel9.setPhoneNumber["0548 22 22 23"];
itemModel9.setIsWorking["Đang làm vic"];
listData.add[itemModel9];

ItemModel itemModel10 = new ItemModel[];
itemModel10.setAvatar[R.drawable.img10];
itemModel10.setHoVaTen["Nguyn 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["Nguyn Văn Klemsan"];
itemModel11.setPosition["SEO"];
itemModel11.setPhoneNumber["0945 888 883"];
itemModel11.setIsWorking["Đang làm vic"];
listData.add[itemModel11];

ItemModel itemModel12 = new ItemModel[];
itemModel12.setAvatar[R.drawable.img12];
itemModel12.setHoVaTen["Nguyn Văn Pentax"];
itemModel12.setPosition["SEO"];
itemModel12.setPhoneNumber["0139 554 124"];
itemModel12.setIsWorking["Thc đa"];
listData.add[itemModel12];

ItemModel itemModel13 = new ItemModel[];
itemModel13.setAvatar[R.drawable.img13];
itemModel13.setHoVaTen["Nguyn 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["Nguyn Văn Hasaki"];
itemModel14.setPosition["Bán hàng"];
itemModel14.setPhoneNumber["0124 458 887"];
itemModel14.setIsWorking["Đang làm vic"];
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:


Qun 1
Qun 2
Qun 3
Qun 4
Qun 5
Qun 6
Qun 7
Qun 8
Qun 9
Qun 10
Qun 11
Qun 12
Qun Gò Vp
Qun Bình Thnh
Qun Tân Bình
Qun Bình Tân
Qun Tân Phú
Qun Phú Nhun
Tp. ThĐc
Huyn Bình Chánh
Huyn Cn Gi
Huyn CChi
Huyn 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 khi to listview listView = findViewById[R.id.list_item];

// load d liu vào mng 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

// khi to 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 bt s kin click vào item trong listview, mình làm mi click là xóa mt item cho bn 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]

package com.tnv.thongcodelab_lwadapter;

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 khi to listview
listView = findViewById[R.id.list_item];

// load d liu vào mng t file strings.xml
List dictrictList = new LinkedList[Arrays.asList[getResources[].getStringArray[R.array.DataShowListview]]];

// khi to 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 bt s kin click vào item trong listview, mình làm mi click là xóa mt item cho bn 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



Gửi email bài đăng nàyBlogThis!Chia sẻ lên TwitterChia sẻ lên Facebook

Video liên quan

Chủ Đề