【问题标题】:Searching a custom listview搜索自定义列表视图
【发布时间】:2013-08-20 02:31:59
【问题描述】:

我很好奇如何使用可搜索的自定义适配器制作列表视图。我按照教程进行了所有设置,但是当我尝试在 EditText 中键入任何内容时应用程序崩溃。现在我知道为什么应用程序崩溃了,我只是不知道如何修复它。

这是我的 MainActivity 的代码:

@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        Context ctx = getApplication();
        Resources res = ctx.getResources();

        String[] options = res.getStringArray(R.array.item_ids);
        String[] ids = res.getStringArray(R.array.item_names);
        TypedArray icons = res.obtainTypedArray(R.array.item_images);

        setListAdapter(new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons));
    }

        @Override
        public boolean onCreateOptionsMenu(Menu menu) {
            // Get the options menu view from menu.xml in menu folder
            getSupportMenuInflater().inflate(R.menu.items_menu, menu);

            // Locate the EditText in menu.xml
            editsearch = (EditText) menu.findItem(R.id.menu_search).getActionView();

            // Capture Text in EditText
            editsearch.addTextChangedListener(textWatcher);

            // Show the search menu item in menu.xml
            MenuItem menuSearch = menu.findItem(R.id.menu_search);

            menuSearch.setOnActionExpandListener(new OnActionExpandListener() {

                // Menu Action Collapse
                @Override
                public boolean onMenuItemActionCollapse(MenuItem item) {
                    // Empty EditText to remove text filtering
                    editsearch.setText("");
                    editsearch.clearFocus();
                    return true;
                }

                // Menu Action Expand
                @Override
                public boolean onMenuItemActionExpand(MenuItem item) {
                    // Focus on EditText
                    editsearch.requestFocus();

                    // Force the keyboard to show on EditText focus
                    InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.toggleSoftInput(InputMethodManager.SHOW_FORCED, 0);
                    return true;
                }
            });

            // Show the settings menu item in menu.xml
            MenuItem menuSettings = menu.findItem(R.id.home);

            // Capture menu item clicks
            menuSettings.setOnMenuItemClickListener(new OnMenuItemClickListener() {

                @Override
                public boolean onMenuItemClick(MenuItem item) {
                    Intent intent2 = new Intent(ItemId.this, Home.class);
                    startActivity(intent2);
                    return true;
                }

            });

            return true;
        }

        // EditText TextWatcher
        private TextWatcher textWatcher = new TextWatcher() {

            @Override
            public void afterTextChanged(Editable s) {
                // TODO Auto-generated method stub
                String text = editsearch.getText().toString()
                        .toLowerCase(Locale.getDefault());
                adapter.getFilter().filter(text);
            }

            @Override
            public void beforeTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

            @Override
            public void onTextChanged(CharSequence arg0, int arg1, int arg2,
                    int arg3) {
                // TODO Auto-generated method stub

            }

        };

这是我的自定义列表视图适配器的代码:

public class ItemIDAdapter extends ArrayAdapter<String> {

    public LayoutInflater mInflater;

    public String[] mStrings;
    public String[] mIds;
    public TypedArray mIcons;   
    public int mViewResourceId;
    ArrayAdapter<String> adapter;

    public ItemIDAdapter(Context ctx, int viewResourceId,
            String[] strings, String[] ids, TypedArray icons) {
        super(ctx, viewResourceId, strings);

        mInflater = (LayoutInflater)ctx.getSystemService(
                Context.LAYOUT_INFLATER_SERVICE);

        mStrings = strings;
        mIds = ids;
        mIcons = icons;       
        mViewResourceId = viewResourceId;
    }

    @Override
    public int getCount() {
        return mStrings.length;
    }

    @Override
    public String getItem(int position) {
        return mStrings[position];
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        convertView = mInflater.inflate(mViewResourceId, null);

        ImageView iv = (ImageView)convertView.findViewById(R.id.option_icon);
        iv.setImageDrawable(mIcons.getDrawable(position));

        TextView tv = (TextView)convertView.findViewById(R.id.option_text);
        tv.setText(mStrings[position]);

        TextView tv1 = (TextView)convertView.findViewById(R.id.itemids);
        tv1.setText(mIds[position]);

        return convertView;
    }

}

当我尝试搜索时应用程序崩溃的原因是因为在 TextWatcher 中,这一行:adapter.getFilter().filter(text); 适配器仅在我的主要活动的顶部定义,但它根本不与我的列表视图一起使用。我被困在这里,真的不知道用什么替换 adapter,因为 ItemIDAdapter 不起作用。感谢您的帮助!

【问题讨论】:

    标签: android listview search adapter textwatcher


    【解决方案1】:

    替换

    setListAdapter(new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons));
    

    adapter = new ItemIDAdapter(ctx, R.layout.idslistitem, ids, options, icons)
    
    setListAdapter(adapter );
    

    【讨论】:

    • 这修复了崩溃!非常感谢!但是,每当我在编辑文本中输入内容并单击键盘上的“完成”时,什么都没有发生。知道为什么吗?
    • 我试过了,但它只是一遍又一遍地用同样的东西向日志猫发送垃圾邮件,上面写着I/endeffect(5461): AbsListView.onMeasure(), getWidth()=1080, getHeight()=914, this=android.widget.ListView{424f6b80 VFED.VC. #102000a android:id/list} 08-19 20:24:04.844: I/endeffect(5461): AbsListView.onMeasure(), getWidth()=1080, getHeight()=914, this=android.widget.ListView{424f6b80 VFED.VC. ......I. 0,0-1080,914 #102000a android:id/list}
    • 有人知道吗?我完全迷失在这里,不知道该怎么办
    猜你喜欢
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 2016-08-12
    • 1970-01-01
    • 2017-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多