Chào mừng đến với Diễn đàn lập trình - Cộng đồng lập trình.
Kết quả 1 đến 2 của 2
  1. #1
    Ngày tham gia
    Sep 2015
    Bài viết
    0

    Bị lỗi khi override lại phương thức getFilter (trong việc tích hợp search vào ListView)

    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

  2. #2
    Ngày tham gia
    Sep 2015
    Bài viết
    0
    khi bạn lấy giá trị bằng cách .size thì nhớ là phần tử cuối của nó là .size() - 1 nhé

 

 

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •