NÚT BÊN DƯỚI LISTVIEW

  -  

Mình chỉ bao gồm kiến thức là video nhằm chia sẻ kỹ năng lập trình sẵn nhỏng bất chợt lại ý muốn viết để đòi hỏi buộc phải mình sẽ thử viết một loạt bài xích nhằm chia sẻ đọc biết của bản thân mình về xây dựng Android. Hy vọng chúng ta cỗ vũ và trong bài viết này mình thích chia sẻ cùng với các bạn về LayoutInflater.

Bạn đang xem: Nút bên dưới listview

Định nghĩa:

LayoutInflater là một trong component giúp cho bạn gửi layout file(Xml) thành View(Java code) vào Android. Quý khách hàng thường áp dụng nó vào phương thức onCreateView của fragment hoặc thủ tục getView lúc custom adapter.

Cách tạo đối tượng người dùng LayoutInflater

Chúng ta bao gồm 2 cách để tạo thành đối tượng người tiêu dùng LayoutInflater:

1.LayoutInflater là một System Service của Android và phương pháp sử dụng của chính nó hệt như các System Service khác như khi bạn sử dụng WINDOW_SERVICE, ALARM_SERVICE xuất xắc LOCATION_SERVICE.

LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);Đây là cách được khulặng dùng tuy nhiên nó khá nhiều năm loại cùng tôi siêu ít khi thực hiện biện pháp này.2. Sử dụng static method của LayoutInflater:

LayoutInflater layoutInflater = LayoutInflater.from(context);Đây là biện pháp tôi hay sử dụng độc nhất do nó nthêm gọn ^_^

Phương thơm thức Inflate

Công bài toán của LayoutInflater là phát âm xml layout tệp tin và biến đổi những nằm trong tính của nó thành 1 View vào Java code. Sau khi có đối tượng người tiêu dùng LayoutInflater, ta rất có thể sử dụng cách thức inflate nhằm đổi khác 1 xml layout tệp tin thành 1 View trong java. Ta tất cả 2 cách thức inflate cùng với con số tđam mê số không giống nhau:

1. View view = layoutInflater.inflate(int resource, ViewGroup parent)2. View view = layoutInflater.inflate(int resource, ViewGroup parent, boolean attachToRoot)Các bạn sẽ vướng mắc những tđắm say số của inflater tất cả ý nghĩa gì? 2 Pmùi hương thức inflate trên chỉ không giống nhau tđê mê số attachToRoot vậy attachToRoot là gì? Cùng tìm hiểu thông sang một số ví dụ nhé.trước hết họ mày mò 3 tmê man số của chính nó là gì đang nhé:Như có mang thì trách nhiệm của LayoutInflater là chuyển đổi xml layout tệp tin thành đối tượng người sử dụng View trong java code, vậy thì:

Tđắm say số trước tiên là: int resource, nó đó là xml layout file cơ mà họ muốn biến hóa thành View.Tsay đắm số trang bị hai là: ViewGroup parent, nó là ViewGroup nơi nhưng xml layout file(tmê say số lắp thêm nhất) rất có thể được nhúng vào, LayoutInflater vẫn biến hóa xml layout file thành View cùng sử dụng các nằm trong tính cân xứng với ViewGroup parrent.Tđê mê số trang bị tía là: attachToRoot, Khi mà lại attachToRoot=true thì ngay sau khi quy trình chuyển đổi xml file(resource) thành View ngừng thì nó đã nhúng View kia vào ViewGroup parent (RIGHT NOW) , lúc attachToRoot = false thì nó chỉ đổi khác xml file(resource) thành View trong java nhưng không thêm ngay lập tức vào ViewGroup(NOT NOW)

Rồi thuộc lấn sân vào ví dụ cho dễ nắm bắt nào..Tôi có xml layout file mang tên là activity_main.xml cùng với root là LinearLayout hướng vertical:

LinearLayout xmlns:android="http://schemas.game android.com/apk/res/android" android:orientation="vertical" android:id="
+id/ll_main" android:layout_width="fill_parent" android:layout_height="fill_parent">LinearLayout>Và 1 xml layout tệp tin không giống thương hiệu là item_button.xml nhỏng sau:

Button xmlns:android="http://schemas.apk.com/apk/res/android" android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Custom Button" android:id="
+id/custom_button">Button>với bây giờ tôi đã sử dụng theo thứ tự những cách tiến hành inflate cùng tôi đang đã cho thấy kết quả sau thời điểm bọn họ sử dụng nó

// TH1: Chúng ta chỉ sử dụng 2 tmê mệt số mặc dù attachToRoot sẽ được đặt mặc định bởi true với kết quả là item_button sẽ tiến hành thay đổi thành View cùng được add vào llMain ngay trong lúc biến hóa chấm dứt.

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain);//TH2: Chúng ta chỉ sử dụng 3 tham cùng với attachToRoot = true, khi đó item_button sẽ tiến hành chuyển thành View và được add vào llMain ngay khi thay đổi hoàn chỉnh tương tự TH1.

Xem thêm: Là Gì? Nghĩa Của Từ Thùng Bia Tiếng Anh Là Gì Thùng Bia Tiếng Anh Là Gì

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, true);TH1 cùng TH2 gồm thuộc công dụng nhỏng hình dưới đây:

*
//TH3: Trường đúng theo này chúng ta cũng thực hiện 3 tham số tuy nhiên với attachToRoot = false, kho đó nó LayoutInflater chỉ biến đổi item_button thành View vào java cơ mà ko làm cho bất cứ vật dụng gì không giống.

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, false);Kết trái của TH3 là button không được add vào LinearLayout nlỗi hình bên dưới.

*
View này sẽ không còn được add vào llMain(ViewGroup) và chỉ còn Lúc chúng ta Hotline cách thức addView của ViewGroup thì View sẽ tiến hành add vào ViewGroup, sau khoản thời gian Điện thoại tư vấn cách làm addView thì kết quả đã như là TH1 cùng TH2:

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, false); llMain.addView(view); //Different

Lưu ý lúc áp dụng LayoutInflater vào custom adapter

Qua 3 ví dụ bên trên vững chắc các bạn cũng đã phát âm tsay mê số attachToRoot dùng để triển khai gì rồi nên không? Tóm lại thì attachToRoot ra quyết định View nhưng được tạo nên vị qua trình inflate của LayoutInflater đạt được add vào ViewGroup parent hay là không.Nhưng bọn họ demo so với ngôi trường vừa lòng sử dụng LayoutInflater vào cách thức getView Lúc custom adapter coi nhé.Ở trong cách làm getView họ hay được dùng nlỗi sau:


Overridepublic View getView(int position, View convertView, ViewGroup parent) View view = LayoutInflater.from(mContext).inflate(R.layout.item_message, parent, false); /* *khu vực nàyánh xạ view với update dữ liệu của view */ return view;Ở thủ tục trên thì LayoutInflater đang gọi tệp tin item_message.xml với chuyển đổi nó thành 1 view và sẽ không còn attach tức thì vào ViewGroup parent(ex:ListView, GridView...)Nếu các bạn áp dụng đoạn code bên trên và mặt Activity bạn mix adapter thì đầy đủ cthị xã đông đảo ổn..áp dụng các bạn chạy bình thường và listview đang hiển thị những tin nhắn.

Nhưng chúng ta nhận thấy là listview hy vọng hiển thị các cửa nhà message, vậy tại sao Khi tạo nên view tự item_message.xml họ ko gán luôn nó vào listview bằng phương pháp cho tđắm đuối số attachToRoot=true ở trong cách làm getView luôn luôn nhỉ...Thử code bên dưới nhé


Override public View getView(int position, View convertView, ViewGroup parent) View view = LayoutInflater.from(mContext).inflate(R.layout.item_message, parent, true); /* *địa điểm nàyánh xạ view và cập nhật dữ liệu của view */ return view; Nếu chúng ta áp dụng code này thì áp dụng của các bạn sẽ bị dừng bất ngờ đột ngột cùng với nguyên ổn nhân:

01-17 01:57:21.961 14112-14112/com.dvt.abc E/AndroidRuntime: FATAL EXCEPTION: main Process: com.dvt.abc, PID: 14112 app android.view.InflateException: Binary XML tệp tin line #20: addView(View, LayoutParams) is not supported in AdapterView Caused by: java.lang.UnsupportedOperationException: addView(View, LayoutParams) is not supported in AdapterView at apk.widget.AdapterView.addView(AdapterView.java:880) at app android.view.LayoutInflater.inflate(LayoutInflater.java:534) at android.view.LayoutInflater.inflate(LayoutInflater.java:427) at com.dvt.abc.MessageAdapter.getView(MessageAdapter.java:38)Tại sao lại điều này...Lúc các bạn áp dụng đoạn code:

public class DemoLayoutInflater extends AppCompatActivity
Nullable Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_demo); LinearLayout llMain = findViewById(R.id.ll_main); View view = LayoutInflater.from(this).inflate(R.layout.item_button, llMain, true);Tại phía trên LayoutInflater đã đọc file item_button.xml thành View (Java code) với add nó làm cho bé của ViewGroup llMain. Kết quả vẫn tương tự cùng với xml layout file này:

LinearLayout xmlns:android="http://schemas.apk.com/apk/res/android" android:orientation="vertical" android:id="
+id/ll_main" android:layout_width="fill_parent" android:layout_height="fill_parent"> Button android:layout_width="match_parent" android:layout_height="wrap_content" android:text="Custom Button" android:id="
+id/custom_button"> Button> LinearLayout>Hành động add view đối với những ViewGroup nlỗi LinearLayout hay RelativeLayout thì hoàn toàn bình thường, bởi những viewgroup có thể đựng được nhiều View nhỏ hoặc ViewGroup không giống ngơi nghỉ vào nó. dẫu vậy một lớp nhỏ của AdapterView như ListView, GridView thì các thành công con của chính nó cần yếu bằng tay bằng câu hỏi add trong xml hoặc trong code như bên dưới đây:

//xml layout fileListView android:id="
+id/lv_data" android:layout_width="match_parent" android:layout_height="wrap_content" > TextView android:layout_width="match_parent" android:layout_height="wrap_content" /> ListView>//Activity
Overrideprotected void onCreate(Bundle savedInstanceState) super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); ListView lvData = findViewById(R.id.lv_data); TextView tvContent = new TextView(this); lvData.addView(tvContent); //Don"t do this//Adapter
Overridepublic View getView(int position, View convertView, ViewGroup parent) //Don"t phối attachToRoot=true View view = LayoutInflater.from(mContext).inflate(R.layout.item_message, parent, true); /* *vị trí nàyánh xạ view với update dữ liệu của view */ return view;Nên nếu như bạn gặp mặt lỗi: addView(View, LayoutParams) is not supported in AdapterView thì nên soát sổ lại coi bạn tất cả hotline add view thủ công bằng tay vào AdapterView không nhé..

Xem thêm: Mua Vé Máy Bay Cần Giấy Tờ Gì ? Mua Vé Máy Bay Cần Những Giấy Tờ Gì

Đó là toàn cục những gì mình thích nói cùng với các bạn về LayoutInflater. Hẹn gặp mặt chúng ta ở các bài tiếp nhé.