android - Android 自定义 ListView 中的搜索功能

标签 android listview android-listview

我有 CursorAdapter 来显示数据库中的数据。现在,我想将搜索功能添加到自定义 ListView 。所以,我尝试了这个。但是,这是行不通的。

 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

            }
        });

这是适配器代码

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;
    }



}

如果你们帮助找出我的代码中的问题或者我如何将搜索功能添加到自定义 ListView ,我将很高兴。

最佳答案

尝试使用它

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);       
}

关于android - Android 自定义 ListView 中的搜索功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18460139/

相关文章:

java - 从android中的另一个类调用mainactivity中的方法

java - 如何运行一系列动画?动画集让我失望

android - ListView 和以编程方式为行留边距

listview - 在 VB6.0 的一个 ListView 中显示 2 个表

android - 向选项卡式 Activity 添加新 Activity

java - 通过 Android 应用程序将命令传递给 adb

android - 如何像在 Google Keep 中那样添加复选框 ListView?

java - 如何使用 float 图标将所有复选框值返回到字符串

android - ListView 滚动时隐藏软输入

android - 查看分页器仅显示 1 个 ListView