1

I have CursorAdapter to show data from database. Now, I want add search functionality to custom listview. So, I tried with this. but, this is not working.

 searchOption.addTextChangedListener(new TextWatcher() {

            @Override
            public void onTextChanged(CharSequence cs, int start, int before, int count) {
                // TODO Auto-generated method stub

                AbstractActivity.this.cursorAdapter.getFilter().filter(cs);
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                // TODO Auto-generated method stub

            }

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub

            }
        });

Here is the Adapter Code

public class AbstractCursorAdapter extends CursorAdapter {
    Cursor cursorOne;

    String getName;

    @SuppressWarnings("deprecation")
    public AbstractCursorAdapter(Context context, Cursor c) {
        super(context, c);
        // TODO Auto-generated constructor stub
    }

    @Override
    public void bindView(View view, Context context, Cursor cursor) {
        // TODO Auto-generated method stub
        TextView title = (TextView)view.findViewById(R.id.abTitle);

        title.setText(cursor.getString(cursor.getColumnIndexOrThrow("TITLE")));
        ;

        TextView topic = (TextView)view.findViewById(R.id.abTopic);

        topic.setText(cursor.getString(cursor.getColumnIndexOrThrow("TOPIC")));

        TextView type = (TextView)view.findViewById(R.id.abType);

        type.setText(cursor.getString(cursor.getColumnIndexOrThrow("TYPE")));

        String value = cursor.getString(cursor.getColumnIndexOrThrow("_id"));

        String sqlQuery = "select abstracts_item._id AS ID,abstract_author.NAME AS NAME from abstracts_item,abstract_author,authors_abstract where abstracts_item._id = authors_abstract.abstractsitem_id and abstract_author._id = authors_abstract.abstractauthor_id and ID = "
                + value;


        cursorOne = DatabaseHelper.database.rawQuery(sqlQuery, null);

        if (cursorOne != null) {
            cursorOne.moveToFirst();
            do {

                if (cursorOne.getPosition() == 0) {

                    getName = cursorOne.getString(cursorOne.getColumnIndexOrThrow("NAME"));

                } else {

                    getName = getName + ","
                            + cursorOne.getString(cursorOne.getColumnIndexOrThrow("NAME"));

                }

            } while (cursorOne.moveToNext());
        }

        TextView authorNames = (TextView)view.findViewById(R.id.SubTitle);

        String formatterNames = "";

        String[] namesArray = getName.split(",");

       // Log.e("Length", String.valueOf(namesArray.length));

        if (namesArray.length > 1) {
            for (int i = 0; i < namesArray.length; i++) {

                if (i == namesArray.length - 1) {
                    formatterNames = formatterNames + " & " + namesArray[i];
                }else if (i == 0){
                    formatterNames = formatterNames +namesArray[i];
                }
                else {
                    formatterNames = formatterNames + " , " +namesArray[i];
                }
            }


            /*
             * Get Width
             */

            WindowManager WinMgr = (WindowManager)context.getSystemService(Context.WINDOW_SERVICE);
            int displayWidth = WinMgr.getDefaultDisplay().getWidth();

            Paint paint = new Paint();
            Rect bounds = new Rect();

            int text_height = 0;
            int text_width = 0;

            //paint.setTypeface(Typeface.DEFAULT);

            paint.getTextBounds(formatterNames, 0, formatterNames.length(), bounds);

            text_height =  bounds.height();
            text_width =  bounds.width();


            Log.e("SIZE", "Text =" + String.valueOf(text_width) + "------" +"Layout = " + String.valueOf(displayWidth));

            if(text_width > displayWidth){

                String output= formatterNames.split(",")[0] + " et al. " ;
                authorNames.setText(output);

             }else{
                 authorNames.setText(formatterNames.replaceAll("((?:^|[^A-Z.])[A-Z])[a-z]*\\s(?=[A-Z])",
                         "$1.")); 
             }


        } else {

            authorNames
            .setText(getName.replaceAll("((?:^|[^A-Z.])[A-Z])[a-z]*\\s(?=[A-Z])", "$1."));
        }
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup viewgroup) {
        // TODO Auto-generated method stub
        LayoutInflater inflater = LayoutInflater.from(viewgroup.getContext());
        View returnView = inflater.inflate(R.layout.abstract_content, viewgroup, false);
        return returnView;
    }



}

I will be glad if you guys help to find out what's the problem in my code or how can i add search functionality to a custom listview.

9
  • Have you used any custom adapter Commented Aug 27, 2013 at 8:09
  • @MohammodHossain Yes. Commented Aug 27, 2013 at 8:11
  • post your custom adapter code part Commented Aug 27, 2013 at 8:12
  • can you add your adapter code? Commented Aug 27, 2013 at 8:12
  • @MohammodHossain Question updated Commented Aug 27, 2013 at 8:16

2 Answers 2

3

Try to use it

adapter.setFilterQueryProvider(new FilterQueryProvider() {
    public Cursor runQuery(CharSequence constraint) {
       // fetch all query data by input String
       // fetchDataByName take input String when search
       return dbHelper.fetchDataByName(constraint.toString());
    }
});

public void onTextChanged(CharSequence s, int start, int before,
            int count) {
     AbstractActivity.this.cursorAdapter.getFilter().filter(cs);       
}
Sign up to request clarification or add additional context in comments.

Comments

0

In beforeTextChanged() method create a new cursorAdapter adapter object .

 new SimpleCursorAdapter (this, Android.Resource.Layout.SimpleListItem1, cursor,
       fromColumns,
       toControlIDs);

1 Comment

this is not good idea. you need to filter the underlying data that populates the list and call notifyDataSetChanged on your adapter

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.