Những hướng dẫn tiếp theo về việc tạo Custom Viewgroup cho người học android
B8: Chúng ta đã tạo xong custem ViewGroup, bây giờ chính là lúc sử dụng. Tạo 1 class mới tên là ListWorkApdapter trong at.exam:Mã:package at.exam;
import java.util.ArrayList;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.CheckBox;
import android.widget.CompoundButton;
import android.widget.TextView;
import
android.widget.CompoundButton.OnCheckedChangeListener;
public class ListWorkAdapter extends
ArrayAdapter<Work>{
ArrayList<Work> array;
int resource;
Context context;
public ListWorkAdapter(Context context, int
textViewResourceId,
ArrayList<Work> objects) {
super(context, textViewResourceId, objects);
this.context = context;
resource = textViewResourceId;
array = objects;
}
//Phương thức xác định View mà Adapter hiển thị, ở
đây chính là CustomViewGroup
//Bắt buộc phải Override khi kế thừa từ
ArrayAdapter
@Override
public View getView(int position, View convertView,
ViewGroup parent) {
View workView = convertView;
if (workView == null) {
workView = new
CustomViewGroup(getContext());
}
//Lấy về đối tượng Work hiện tại
final Work work = array.get(position);
if (work != null) {
TextView workContent = ((CustomViewGroup)
workView).workContent;
TextView timeContent = ((CustomViewGroup)
workView).timeContent;
CheckBox checkWork = ((CustomViewGroup)
workView).cb;
//Set sự kiện khi đánh dấu vào checkbox
trên list
checkWork.setOnCheckedChangeListener(new
OnCheckedChangeListener() {
@Override
public void
onCheckedChanged(CompoundButton buttonView,
boolean isChecked) {
work.setChecked(isChecked);
}
});
//Lấy về nội dung cho TextView và CheckBox
dựa vào đối tượng Work hiện tại
workContent.setText(work.getContent());
timeContent.setText(work.getTime());
checkWork.setChecked(work.isChecked());
}
return workView;
}
}
ListWorkAdapter sẽ được sử dụng thay thế cho ArrayAdapter được bind với ListView. Thông thường ArrayAdapter chỉ cho hiển thị String bằng TextView, nhưng với việc kế thừa và override phương thức getView, ta có thể định nghĩa lại hiển thị cho các thành phần của ListView.
B9: Việc cuối cùng cần làm là viết lại Activity. Tới Example.java và chỉnh sửa theo nội dung sau:Mã:
package at.exam;
import java.util.ArrayList;
import android.app.Activity;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.ArrayAdapter;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class Example extends Activity {
//Các hằng dùng cho tạo Option Menu
private static final int DELETE_WORK = Menu.FIRST;
private static final int ABOUT = Menu.FIRST + 2;
ArrayList<Work> array;
ListWorkAdapter arrayAdapter;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
array = new ArrayList<Work>();
arrayAdapter = new ListWorkAdapter(this,
R.layout.list, array);
final EditText workEnter = (EditText)
findViewById(R.id.work_enter);
final EditText hourEdit = (EditText)
findViewById(R.id.hour_edit);
final EditText minuteEdit = (EditText)
findViewById(R.id.minute_edit);
final Button button = (Button)
findViewById(R.id.button);
//Tạo list view cho danh sách công việc
final ListView list = (ListView)
findViewById(R.id.list);
list.setAdapter(arrayAdapter);
OnClickListener add = new OnClickListener() {
@Override
public void onClick(View v) {
if
(workEnter.getText().toString().equals("") ||
hourEdit.getText().toString().equals("") ||
minuteEdit.getText().toString().equals("")) {
AlertDialog.Builder builder = new
AlertDialog.Builder(Example.this);
builder.setTitle("Info missing");
builder.setMessage("Please enter
all information of the work");
builder.setPositiveButton("Continue", new
DialogInterface.OnClickListener() {
public void
onClick(DialogInterface dialog, int which) {
// TODO Auto-generated
method stub
}
});
builder.show();
}
else {
String workContent =
workEnter.getText().toString();
String timeContent =
hourEdit.getText().toString() + ":"
+
minuteEdit.getText().toString();
Work work = new Work(workContent,
timeContent);
array.add(0, work);
arrayAdapter.notifyDataSetChanged();
workEnter.setText("");
hourEdit.setText("");
minuteEdit.setText("");
}
}
};
button.setOnClickListener(add);
}
//Tạo Option Menu
public boolean onCreateOptionsMenu(Menu menu) {
super.onCreateOptionsMenu(menu);
menu.add(0, DELETE_WORK, 0,"Delete"
).setIcon(android.R.drawable.ic_delete);
menu.add(0, ABOUT, 0,"About"
).setIcon(android.R.drawable.ic_menu_info_details);
return true;
}
//Xử lý sự kiện khi các option trong Option Menu
được lựa chọn
public boolean onOptionsItemSelected(MenuItem item)
{
switch (item.getItemId()) {
case DELETE_WORK: {
deleteCheckedWork();
break;
}
case ABOUT: {
AlertDialog.Builder builder = new
AlertDialog.Builder(this);
builder.setTitle("VietAndroid");
builder.setMessage("AUTHOR:" + "\n" + "
Nguyen Anh Tuan" + "\n" + "SOURCE:" + "\n" + "
diendan.vietandroid.com");
builder.setPositiveButton("Close", new
DialogInterface.OnClickListener() {
public void onClick(DialogInterface
dialog, int which) {
}
});
builder.setIcon(android.R.drawable.ic_dialog_info);
builder.show();
break;
}
}
return true;
}
private void deleteCheckedWork() {
if (array.size() > 0) {
for (int i = 0; i < array.size(); i++) {
if (i > array.size()) {
break;
}
if (array.get(i).isChecked()) {
array.remove(i);
arrayAdapter.notifyDataSetChanged();
continue;
}
}
}
}
}
OK. Vậy là xong. Option Menu là menu ẩn chỉ hiện ra khi bạn nhấn nút Menu của điện thoại. Option Menu rất tiện trong việc đưa ra các tùy chỉnh, giống như khi bạn nhấn phím Esc khi đang chơi game trên PC vậy.
Các bạn có thể lưu ý là thay vì sử dụng ArrayList<String> như trước mình đã thay bằng ArrayList<Work> và trong khởi tạo đối tượng arrayAdapter thì đối số thứ 2
là R.layout.list thay vì android.R.layout.simple_list_item_1, nghĩa là chúng ta đã sử dụng layout do mình tự tạo thay vì layout Android cung cấp sẵn cho hiển thị các thành phần của ListView.
Nếu chạy thử, các bạn có thể thấy khi ta đánh dấu vào checkbox của 1 thành phần trong list, rồi nhấn Menu và chọn delete thì thành phần sẽ bị gỡ bỏ khỏi danh sách.
0 nhận xét:
Đăng nhận xét