Mình mới nghiên cứu lập trình android được 2 tuần, còn nhiều vấn đề không lí giải được. CỤ thể là mình định làm một listView hiển thị danh bạ điện thoại, listView đó tích hợp search (editText) để lọc các phần tử trong listView. (toàn bộ code project mình đính kèm phía dưới)
Giao diện như sau.
Nhưng khi thực hiện lọc danh sách thì lại lỗi "unfotunately ..has stop".
Mình khai báo một class như sau:
Mã:
package com.example.contact_moduls;
public class contactView {
private int id;
private String name;
private String num;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getNum() {
return num;
}
public void setNum(String num) {
this.num = num;
}
}
Đây là code phần custom lại adapter của listView và override lại phương thức getFilter của mình.
Mã:
package com.example.contact_moduls;
import java.util.ArrayList;
import android.annotation.SuppressLint;
import android.app.Activity;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.Filter;
import android.widget.TextView;
public class myListViewAdapter extends ArrayAdapter<contactView> {
private Activity context = null;
private ArrayList<contactView> myArr = null;
private int layoutId;
public myListViewAdapter(Activity context, int layoutId,
ArrayList<contactView> arr) {
super(context, layoutId, arr);
// TODO Auto-generated constructor stub
this.context = context;
this.layoutId = layoutId;
this.myArr = arr;
}
/*
* (non-Javadoc)
*
* @see android.widget.ArrayAdapter#getView(int, android.view.View,
* android.view.ViewGroup)
*/
@Override
public View getView(int position, View convertView, ViewGroup parent) {
if (convertView == null) {
LayoutInflater inflater = context.getLayoutInflater();
convertView = inflater.inflate(layoutId, null);
}
LayoutInflater inflater = context.getLayoutInflater();
convertView = inflater.inflate(layoutId, null);
//
if (myArr.size() > 0 && position >= 0) {
// dòng lệnh lấy TextView ra để hiển thị Name và số điện thoại
final TextView txtName = (TextView) convertView
.findViewById(R.id.txtName);
final TextView txtNum = (TextView) convertView
.findViewById(R.id.txtNum);
// lấy ra contact thứ position
final contactView ctView = myArr.get(position);
// đưa thông tin lên TextView
txtName.setText(ctView.getName());
txtNum.setText(ctView.getNum());
}
return convertView;
}
/*
* (non-Javadoc)
*
* @see android.widget.ArrayAdapter#getFilter()
*/
@Override
public Filter getFilter() {
// TODO Auto-generated method stub
return new Filter() {
@Override
protected void publishResults(CharSequence constraint,
FilterResults results) {
// TODO Auto-generated method stub
myArr = (ArrayList<contactView>) results.values;
notifyDataSetChanged();
}
@Override
protected FilterResults performFiltering(CharSequence constraint) {
// TODO Auto-generated method stub
ArrayList<contactView> filterResult = filterData(constraint);
FilterResults filter = new FilterResults();
filter.values = filterResult;
filter.count = filterResult.size();
return filter;
}
private ArrayList<contactView> filterData(CharSequence constraint) {
// TODO Auto-generated method stub
if (constraint.length() == 0)
return myArr;
// do stuff here
ArrayList<contactView> results = new ArrayList<contactView>();
for (int i = 0; i < myArr.size(); i++)
if (myArr.get(i).getName().toLowerCase()
.startsWith(constraint.toString().toLowerCase()))
results.add(myArr.get(i));
return results;
}
};
}
public void setmyArr(ArrayList<contactView> myArr) {
this.myArr = myArr;
}
}
Còn đây là code chương trình chính
Mã:
package com.example.contact_moduls;
import java.util.ArrayList;
import android.os.Bundle;
import android.app.Activity;
import android.text.Editable;
import android.text.TextWatcher;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ListView;
public class MainActivity extends Activity {
ArrayList<contactView> arr = new ArrayList<contactView>();
// Sử dụng MyArrayAdapter thay vì ArrayAdapter
myListViewAdapter adapter = null;
ListView lvContact = null;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
contactView tmp;
int i = 1;
// add New contact
tmp = new contactView();
tmp.setId(i++);
tmp.setName("John Lemon");
Khi chạy chương trình mình nhập "j" để lọc nhưng lại lỗi và thoát ra.
Đây là logCat
Mã:
07-08 02:46:13.273: D/dalvikvm(1009): GC_FOR_ALLOC freed 48K, 6% free 2632K/2800K, paused 47ms, total 50ms
07-08 02:46:13.283: I/dalvikvm-heap(1009): Grow heap (frag case) to 3.291MB for 635812-byte allocation
07-08 02:46:13.412: D/dalvikvm(1009): GC_FOR_ALLOC freed 3K, 6% free 3249K/3424K, paused 120ms, total 120ms
07-08 02:46:13.482: D/dalvikvm(1009): GC_CONCURRENT freed <1K, 5% free 3261K/3424K, paused 5ms+11ms, total 72ms
07-08 02:46:14.082: I/Choreographer(1009): Skipped 117 frames! The application may be doing too much work on its main thread.
07-08 02:46:14.132: D/gralloc_goldfish(1009): Emulator without GPU emulation detected.
07-08 02:46:14.493: I/Choreographer(1009): Skipped 58 frames! The application may be doing too much work on its main thread.
07-08 02:46:24.972: D/AndroidRuntime(1009): Shutting down VM
07-08 02:46:24.982: W/dalvikvm(1009): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-08 02:46:25.133: E/AndroidRuntime(1009): FATAL EXCEPTION: main
07-08 02:46:25.133: E/AndroidRuntime(1009): java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
07-08 02:46:25.133: E/AndroidRuntime(1009): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
07-08 02:46:25.133: E/AndroidRuntime(1009): at java.util.ArrayList.get(ArrayList.java:304)
07-08 02:46:25.133: E/AndroidRuntime(1009): at com.example.contact_moduls.myListViewAdapter.getView(myListViewAdapter.java:52)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.AbsListView.obtainView(AbsListView.java:2143)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.ListView.measureHeightOfChildren(ListView.java:1246)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.ListView.onMeasure(ListView.java:1158)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.View.measure(View.java:15518)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.View.measure(View.java:15518)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.View.measure(View.java:15518)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.View.measure(View.java:15518)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-08 02:46:25.133: E/AndroidRuntime(1009): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.View.measure(View.java:15518)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.Choreographer.doFrame(Choreographer.java:532)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.os.Handler.handleCallback(Handler.java:725)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.os.Handler.dispatchMessage(Handler.java:92)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.os.Looper.loop(Looper.java:137)
07-08 02:46:25.133: E/AndroidRuntime(1009): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-08 02:46:25.133: E/AndroidRuntime(1009): at java.lang.reflect.Method.invokeNative(Native Method)
07-08 02:46:25.133: E/AndroidRuntime(1009): at java.lang.reflect.Method.invoke(Method.java:511)
07-08 02:46:25.133: E/AndroidRuntime(1009): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-08 02:46:25.133: E/AndroidRuntime(1009): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-08 02:46:25.133: E/AndroidRuntime(1009): at dalvik.system.NativeStart.main(Native Method)
07-08 02:46:25.362: D/dalvikvm(1009): GC_CONCURRENT freed 235K, 10% free 3517K/3876K, paused 84ms+94ms, total 371ms
07-08 02:46:27.742: I/Process(1009): Sending signal. PID: 1009 SIG: 9
07-08 02:59:58.543: D/dalvikvm(1105): GC_FOR_ALLOC freed 55K, 7% free 2632K/2808K, paused 44ms, total 47ms
07-08 02:59:58.553: I/dalvikvm-heap(1105): Grow heap (frag case) to 3.291MB for 635812-byte allocation
07-08 02:59:58.623: D/dalvikvm(1105): GC_FOR_ALLOC freed 3K, 6% free 3249K/3432K, paused 62ms, total 62ms
07-08 02:59:58.722: D/dalvikvm(1105): GC_CONCURRENT freed 2K, 5% free 3273K/3432K, paused 19ms+23ms, total 101ms
07-08 02:59:59.412: I/Choreographer(1105): Skipped 121 frames! The application may be doing too much work on its main thread.
07-08 02:59:59.452: D/gralloc_goldfish(1105): Emulator without GPU emulation detected.
07-08 02:59:59.752: I/Choreographer(1105): Skipped 37 frames! The application may be doing too much work on its main thread.
07-08 03:08:47.913: I/Choreographer(1105): Skipped 41 frames! The application may be doing too much work on its main thread.
07-08 03:09:13.052: I/Choreographer(1105): Skipped 33 frames! The application may be doing too much work on its main thread.
07-08 03:10:02.222: E/Trace(1190): error opening trace file: No such file or directory (2)
07-08 03:10:03.412: D/dalvikvm(1190): GC_FOR_ALLOC freed 58K, 7% free 2632K/2812K, paused 46ms, total 50ms
07-08 03:10:03.422: I/dalvikvm-heap(1190): Grow heap (frag case) to 3.291MB for 635812-byte allocation
07-08 03:10:03.482: D/dalvikvm(1190): GC_FOR_ALLOC freed 3K, 6% free 3249K/3436K, paused 56ms, total 56ms
07-08 03:10:03.552: D/dalvikvm(1190): GC_CONCURRENT freed <1K, 6% free 3262K/3436K, paused 5ms+14ms, total 72ms
07-08 03:10:04.123: I/Choreographer(1190): Skipped 110 frames! The application may be doing too much work on its main thread.
07-08 03:10:04.163: D/gralloc_goldfish(1190): Emulator without GPU emulation detected.
07-08 03:10:04.532: I/Choreographer(1190): Skipped 57 frames! The application may be doing too much work on its main thread.
07-08 03:10:09.813: D/AndroidRuntime(1190): Shutting down VM
07-08 03:10:09.813: W/dalvikvm(1190): threadid=1: thread exiting with uncaught exception (group=0x40a71930)
07-08 03:10:09.972: E/AndroidRuntime(1190): FATAL EXCEPTION: main
07-08 03:10:09.972: E/AndroidRuntime(1190): java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
07-08 03:10:09.972: E/AndroidRuntime(1190): at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:251)
07-08 03:10:09.972: E/AndroidRuntime(1190): at java.util.ArrayList.get(ArrayList.java:304)
07-08 03:10:09.972: E/AndroidRuntime(1190): at com.example.contact_moduls.myListViewAdapter.getView(myListViewAdapter.java:52)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.AbsListView.obtainView(AbsListView.java:2143)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.ListView.measureHeightOfChildren(ListView.java:1246)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.ListView.onMeasure(ListView.java:1158)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.View.measure(View.java:15518)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1404)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.LinearLayout.measureVertical(LinearLayout.java:695)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.View.measure(View.java:15518)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.View.measure(View.java:15518)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.LinearLayout.measureVertical(LinearLayout.java:847)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.LinearLayout.onMeasure(LinearLayout.java:588)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.View.measure(View.java:15518)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:4825)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.widget.FrameLayout.onMeasure(FrameLayout.java:310)
07-08 03:10:09.972: E/AndroidRuntime(1190): at com.android.internal.policy.impl.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2176)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.View.measure(View.java:15518)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:1874)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1089)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1265)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:989)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:4351)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.Choreographer$CallbackRecord.run(Choreographer.java:749)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.Choreographer.doCallbacks(Choreographer.java:562)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.Choreographer.doFrame(Choreographer.java:532)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:735)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.os.Handler.handleCallback(Handler.java:725)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.os.Handler.dispatchMessage(Handler.java:92)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.os.Looper.loop(Looper.java:137)
07-08 03:10:09.972: E/AndroidRuntime(1190): at android.app.ActivityThread.main(ActivityThread.java:5041)
07-08 03:10:09.972: E/AndroidRuntime(1190): at java.lang.reflect.Method.invokeNative(Native Method)
07-08 03:10:09.972: E/AndroidRuntime(1190): at java.lang.reflect.Method.invoke(Method.java:511)
07-08 03:10:09.972: E/AndroidRuntime(1190): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:793)
07-08 03:10:09.972: E/AndroidRuntime(1190): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:560)
07-08 03:10:09.972: E/AndroidRuntime(1190): at dalvik.system.NativeStart.main(Native Method)
07-08 03:10:10.213: D/dalvikvm(1190): GC_CONCURRENT freed 235K, 10% free 3515K/3876K, paused 89ms+117ms, total 391ms
07-08 03:10:12.082: I/Process(1190): Sending signal. PID: 1190 SIG: 9
Mong mọi người giúp mình sửa lỗi nhé, cảm ơn rất nhiều.
p/s: project mình đính kèm phía dưới
View more random threads:
Thông qua phân tích dữ liệu Google từ 86 quốc gia, mới đây, một công ty tại Anh đã công bố bảng xếp hạng kích tấc "cậu nhỏ" của các nước trên thế giới. Kết quả, hầu hết các nước xếp ở nhóm đầu của...
"Chim" của chàng trai Việt thuộc...