执行搜索后的ListView setOnItemClickListener不工作 [英] ListView setOnItemClickListener not working after implementing search

查看:146
本文介绍了执行搜索后的ListView setOnItemClickListener不工作的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个具有搜索功能的对话框里一个简单的列表视图。搜索功能工作正常,但名单的setOnItemClickListener停止工作执行搜索后。

函数来创建列表视图:

 私人无效showCollegePopUp(){
        QustomDialogBu​​ilder建设者=新QustomDialogBu​​ilder(EditYourProfile.this);
        builder.setDividerColor(ColorController.bright_green);        视图V = builder.setCustomView(R.layout.dialog_friend_layout,这一点);        最终的ListView列表=(ListView控件)v.findViewById(R.id.dialog_list_view_friends);
        LayoutInflater吹气=(LayoutInflater)EditYourProfile.this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
        footerView = inflater.inflate(R.layout.add_college_list_footer,列表,FALSE);
        list.addFooterView(footerView);
        inputSearch =(EditText上)v.findViewById(R.id.inputSearch);
        TextView中的TextView =(TextView中)v.findViewById(R.id.add_college);        textView.setTypeface(TypeFaceController.generalTextFace(EditYourProfile.this));        的LinearLayout footer_linear_layout =(的LinearLayout)v.findViewById(R.id.footer_linear_layout);
        footer_linear_layout.setOnClickListener(新View.OnClickListener(){
            @覆盖
            公共无效的onClick(视图v){
                alertDialog.dismiss();
                意图I =新意图(EditYourProfile.this,CreateCollegeActivity.class);
                startActivity(ⅰ);
            }
        });
        footerView.setVisibility(View.GONE);        如果(listOfCollegeCourseNames.size()== 0){
            listOfCollegeCourseNames.add(抢学院......);
        }        适配器=新CustomDialogAdapterBasic(EditYourProfile.this,android.R.id.text1,listOfCollegeCourseNames);
        list.setPadding(16,0,0,0);
        list.setAdapter(适配器);
        inputSearch.addTextChangedListener(新TextWatcher(){            //对EditTex改变字的事件时
            @覆盖
            公共无效onTextChanged(CharSequence中,诠释开始,诠释之前,诠释计数){
                Log.e(文本,文本[+ S +]);                。adapter.getFilter()过滤(s.toString());
            }            @覆盖
            公共无效beforeTextChanged(CharSequence中,诠释开始,诠释计数,
                                          INT后){            }            @覆盖
            公共无效afterTextChanged(编辑S){
            }        });
        builder.setTitle(选择你的大学);
        builder.setMessage(从列表中选择大学:);
        builder.setCancelable(真);        builder.setPositiveButton(取消,新DialogInterface.OnClickListener(){
            公共无效的onClick(DialogInterface为arg0,ARG1 INT){            }
        });        list.setOnItemClickListener(新OnItemClickListener(){
            公共无效onItemClick(适配器视图<>母公司,观景,INT位置,长的id){
                //随你的便,请                如果(adapter.getItem(位置)的ToString()。等于(collegeData.get(位置).getNameForCollege(​​))
                        || adapter.getItem(位置)的ToString()。等于(collegeData.get(位置).getStudentsNameForCollege(​​))){                    newCollegeName = adapter.getItem(位置)的ToString();                    collegeEditPage.setText(Html.fromHtml((newCollegeName))); // +
                                                                                //编辑));
                    //courseEditPage.setText(Html​​.fromHtml((\"Must选择新课程))); // +
                                                                                        //编辑));
                    //当然不存在了。
                    studentObject.setCourseName(NULL);
                    studentObject.setCollegeName(newCollegeName);                    如果(EditYourProfile.this.alertDialog!= NULL){
                        EditYourProfile.this.alertDialog.dismiss();
                        //刷新使用的列表。
                        listOfCollegeCourseNames =新的ArrayList<串GT;();
                        newCollegeId = collegeData.get(位置).getCollegeUnqId();
                        studentObject.setCollegeId(newCollegeId);
                    }                }            }
        });        this.alertDialog = builder.create();
        this.alertDialog.setOnShowListener(新OnShowListener(){
            @覆盖
            公共无效昂秀(DialogInterface对话){
                AlertDialog alertDialog =(AlertDialog)对话框;
                Button按钮= alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
                button.setTextSize(17);
                button.setTypeface(TypeFaceController.titleFace(getApplicationContext()));
            }
        });
        alertDialog.show();    }

ListView的适配器,支持搜索功能:

 公共类CustomDialogAdapterBasic扩展ArrayAdapter<串GT;实现可筛选{    上下文语境;
    清单<串GT; values​​ComingIn =新的ArrayList<串GT;();
    清单<串GT; values​​Filtered =新的ArrayList<串GT;();
    私人ItemFilter MFILTER =新ItemFilter();
    公共CustomDialogAdapterBasic(上下文的背景下,INT资源列表与LT;弦乐> listComingIn){
        超(背景下,资源);
        this.context =背景;
        this.values​​ComingIn = listComingIn;
        this.values​​Filtered = listComingIn;
    }
    公共无效updateBrowser(){
        this.notifyDataSetChanged();
    }    @覆盖
    公众诠释的getCount(){
        返回values​​Filtered.size();
    }    公共字符串的getItem(INT位置)抛出IndexOutOfBoundsException异常{
        返回values​​Filtered.get(位置);
    }    众长getItemId(INT位置){
        返回的位置;
    }    @覆盖
    公共布尔isEnabled(INT位置){
        返回true;
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        查看rowView = inflater.inflate(R.layout.qustom_layout_list,父母,假);
        TextView中的TextView =(TextView中)rowView.findViewById(R.id.basic_text_view);        textView.setTypeface(TypeFaceController.generalTextFace(上下文));
        textView.setText(的getItem(位置));        返回rowView;
    }    公共过滤用getFilter(){
        返回MFILTER;
    }    私有类ItemFilter扩展过滤器{
        @覆盖
        保护FilterResults performFiltering(CharSequence的约束){            字符串filterString = constraint.toString()与toLowerCase()。
            Log.e(filterString,filterString);            FilterResults结果=新FilterResults();            最终名单<串GT;名单= values​​ComingIn;            诠释计数=则为list.size();
            最终的ArrayList<串GT; NLIST =新的ArrayList<串GT;(计数);            串filterableString;            的for(int i = 0; I<计数;我++){
                filterableString = list.get(ⅰ);
                如果(filterableString.toLowerCase()。包括(filterString)){
                    nlist.add(filterableString);
                }
            }            results.values​​ = NLIST;
            results.count = nlist.size();            返回结果;
        }        @燮pressWarnings(未登记)
        @覆盖
        保护无效publishResults(CharSequence的约束,FilterResults结果){
            values​​Filtered =(ArrayList的<串GT;)results.values​​;
            notifyDataSetChanged();
        }    }}

列表视图行布局:

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直
    机器人:descendantFocusability =blocksDescendants>    <的TextView
        机器人:ID =@ + ID / basic_text_view
        机器人:layout_width =WRAP_CONTENT
        机器人:layout_height =WRAP_CONTENT
        机器人:TEXTSIZE =17sp
        机器人:layout_margin =8DP
        机器人:文字=TextView的/>< / LinearLayout中>

包含列表视图对话框的布局:

 < LinearLayout中的xmlns:机器人=htt​​p://schemas.android.com/apk/res/android
    机器人:layout_width =match_parent
    机器人:layout_height =match_parent
    机器人:方向=垂直>    < EditText上机器人:ID =@ + ID / inputSearch
        机器人:layout_width =FILL_PARENT
        机器人:layout_height =WRAP_CONTENT
        机器人:提示=搜索院校。
        安卓的inputType =textVisiblePassword/>
    < ListView控件
        机器人:ID =@ + ID / dialog_list_view_friends
        机器人:layout_width =match_parent
        机器人:layout_height =match_parent
        >< /&的ListView GT;< / LinearLayout中>

我在哪里去了?为什么 setOnItemClickListener 搜索后没有工作?


解决方案

 试试这个方式来实现clickListener
公共类CustomDialogAdapterBasic扩展ArrayAdapter<串GT;实现可筛选{    上下文语境;
    清单<串GT; values​​ComingIn =新的ArrayList<串GT;();
    清单<串GT; values​​Filtered =新的ArrayList<串GT;();
    私人ItemFilter MFILTER =新ItemFilter();
    公共CustomDialogAdapterBasic(上下文的背景下,INT资源列表与LT;弦乐> listComingIn){
        超(背景下,资源);
        this.context =背景;
        this.values​​ComingIn = listComingIn;
        this.values​​Filtered = listComingIn;
    }
    公共无效updateBrowser(){
        this.notifyDataSetChanged();
    }    @覆盖
    公众诠释的getCount(){
        返回values​​Filtered.size();
    }    公共字符串的getItem(INT位置)抛出IndexOutOfBoundsException异常{
        返回values​​Filtered.get(位置);
    }    众长getItemId(INT位置){
        返回的位置;
    }    @覆盖
    公共布尔isEnabled(INT位置){
        返回true;
    }    @覆盖
    公共查看getView(INT位置,查看convertView,父母的ViewGroup){
        LayoutInflater吹气=(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        查看rowView = inflater.inflate(R.layout.qustom_layout_list,父母,假);
        TextView中的TextView =(TextView中)rowView.findViewById(R.id.basic_text_view);        textView.setTypeface(TypeFaceController.generalTextFace(上下文));
        textView.setText(的getItem(位置));
textView.setOnClickListener(新侦听器(的getItem(位置)));
        返回rowView;
    }    公共过滤用getFilter(){
        返回MFILTER;
    }    类监听实现View.OnClickListener
    {
    字符串的TextData;
    侦听器(字符串的TextData)
    {
    this.textData =的TextData;
    }     @覆盖
        公共无效的onClick(视图v){
          //这里实现你的点击功能,并调用此类活动的任何方法
          //((ActivityName)上下文).methodName();
        }
    }    私有类ItemFilter扩展过滤器{
        @覆盖
        保护FilterResults performFiltering(CharSequence的约束){            字符串filterString = constraint.toString()与toLowerCase()。
            Log.e(filterString,filterString);            FilterResults结果=新FilterResults();            最终名单<串GT;名单= values​​ComingIn;            诠释计数=则为list.size();
            最终的ArrayList<串GT; NLIST =新的ArrayList<串GT;(计数);            串filterableString;            的for(int i = 0; I<计数;我++){
                filterableString = list.get(ⅰ);
                如果(filterableString.toLowerCase()。包括(filterString)){
                    nlist.add(filterableString);
                }
            }            results.values​​ = NLIST;
            results.count = nlist.size();            返回结果;
        }        @燮pressWarnings(未登记)
        @覆盖
        保护无效publishResults(CharSequence的约束,FilterResults结果){
            values​​Filtered =(ArrayList的<串GT;)results.values​​;
            notifyDataSetChanged();
        }    }}

I have a simple listview inside a dialog which has a search function. The search function is working fine, but the list's setOnItemClickListener stops working after a search is performed.

Function to create the listview:

private void showCollegePopUp(){
        QustomDialogBuilder builder = new QustomDialogBuilder(EditYourProfile.this);
        builder.setDividerColor(ColorController.bright_green);

        View v = builder.setCustomView(R.layout.dialog_friend_layout, this);

        final ListView list = (ListView) v.findViewById(R.id.dialog_list_view_friends);
        LayoutInflater inflater = (LayoutInflater)EditYourProfile.this.getSystemService
                (Context.LAYOUT_INFLATER_SERVICE);
        footerView = inflater.inflate(R.layout.add_college_list_footer, list, false);
        list.addFooterView(footerView);


        inputSearch = (EditText)v.findViewById(R.id.inputSearch);
        TextView textView = (TextView) v.findViewById(R.id.add_college);

        textView.setTypeface(TypeFaceController.generalTextFace(EditYourProfile.this));

        LinearLayout footer_linear_layout = (LinearLayout)v.findViewById(R.id.footer_linear_layout);
        footer_linear_layout.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                alertDialog.dismiss();
                Intent i = new Intent(EditYourProfile.this, CreateCollegeActivity.class);
                startActivity(i);
            }
        });
        footerView.setVisibility(View.GONE);

        if (listOfCollegeCourseNames.size() == 0) {
            listOfCollegeCourseNames.add("Grabbing colleges...");
        }

        adapter = new CustomDialogAdapterBasic(EditYourProfile.this, android.R.id.text1, listOfCollegeCourseNames);
        list.setPadding(16, 0, 0, 0);
        list.setAdapter(adapter);
        inputSearch.addTextChangedListener(new TextWatcher() {

            //Event when changed word on EditTex
            @Override
            public void onTextChanged(CharSequence s, int start, int before, int count) {
                Log.e("Text", "Text [" + s + "]");

                adapter.getFilter().filter(s.toString());
            }

            @Override
            public void beforeTextChanged(CharSequence s, int start, int count,
                                          int after) {

            }

            @Override
            public void afterTextChanged(Editable s) {
            }

        });
        builder.setTitle("Select your college");
        builder.setMessage("Choose College from the list:");
        builder.setCancelable(true);

        builder.setPositiveButton("Cancel", new DialogInterface.OnClickListener() {
            public void onClick(DialogInterface arg0, int arg1){

            }
        });

        list.setOnItemClickListener(new OnItemClickListener() {
            public void onItemClick(AdapterView<?> parent, View view, int position, long id){
                // Do as you please

                if (adapter.getItem(position).toString().equals(collegeData.get(position).getNameForCollege())
                        || adapter.getItem(position).toString().equals(collegeData.get(position).getStudentsNameForCollege())) {

                    newCollegeName = adapter.getItem(position).toString();

                    collegeEditPage.setText(Html.fromHtml((newCollegeName)));// +
                                                                                // edit));
                    //courseEditPage.setText(Html.fromHtml(("Must choose new course")));// +
                                                                                        // edit));
                    // course doesn't exist anymore.
                    studentObject.setCourseName(null);
                    studentObject.setCollegeName(newCollegeName);

                    if (EditYourProfile.this.alertDialog != null) {
                        EditYourProfile.this.alertDialog.dismiss();
                        // Refresh the list used.
                        listOfCollegeCourseNames = new ArrayList<String>();
                        newCollegeId = collegeData.get(position).getCollegeUnqId();
                        studentObject.setCollegeId(newCollegeId);
                    }

                }

            }
        });

        this.alertDialog = builder.create();
        this.alertDialog.setOnShowListener(new OnShowListener() {
            @Override
            public void onShow(DialogInterface dialog){
                AlertDialog alertDialog = (AlertDialog) dialog;
                Button button = alertDialog.getButton(DialogInterface.BUTTON_POSITIVE);
                button.setTextSize(17);
                button.setTypeface(TypeFaceController.titleFace(getApplicationContext()));
            }
        });
        alertDialog.show();

    } 

Listview's adapter that supports search functionality:

public class CustomDialogAdapterBasic extends ArrayAdapter<String> implements Filterable {

    Context context;
    List<String> valuesComingIn = new ArrayList<String>();
    List<String> valuesFiltered = new ArrayList<String>();
    private ItemFilter mFilter = new ItemFilter();


    public CustomDialogAdapterBasic(Context context, int resource, List<String> listComingIn) {
        super(context, resource);
        this.context = context;
        this.valuesComingIn = listComingIn;
        this.valuesFiltered = listComingIn;
    }


    public void updateBrowser() {
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return valuesFiltered.size();
    }

    public String getItem(int position) throws IndexOutOfBoundsException {
        return valuesFiltered.get(position);
    }

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

    @Override
    public boolean isEnabled(int position) {
        return true;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.qustom_layout_list, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.basic_text_view);

        textView.setTypeface(TypeFaceController.generalTextFace(context));
        textView.setText(getItem(position));

        return rowView;
    }

    public Filter getFilter() {
        return mFilter;
    }

    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String filterString = constraint.toString().toLowerCase();
            Log.e("filterString", filterString);

            FilterResults results = new FilterResults();

            final List<String> list = valuesComingIn;

            int count = list.size();
            final ArrayList<String> nlist = new ArrayList<String>(count);

            String filterableString ;

            for (int i = 0; i < count; i++) {
                filterableString = list.get(i);
                if (filterableString.toLowerCase().contains(filterString)) {
                    nlist.add(filterableString);
                }
            }

            results.values = nlist;
            results.count = nlist.size();

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            valuesFiltered = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }

    }

}

Listview row layout:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:id="@+id/basic_text_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:textSize="17sp"
        android:layout_margin="8dp"
        android:text="TextView" />

</LinearLayout>

The layout of the dialog containing listview:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <EditText android:id="@+id/inputSearch"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:hint="Search colleges.."
        android:inputType="textVisiblePassword"/>
    <ListView
        android:id="@+id/dialog_list_view_friends"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        ></ListView>

</LinearLayout>

Where am I going wrong? Why is the setOnItemClickListener not working after search?

解决方案

Try this way to implement clickListener
public class CustomDialogAdapterBasic extends ArrayAdapter<String> implements Filterable {

    Context context;
    List<String> valuesComingIn = new ArrayList<String>();
    List<String> valuesFiltered = new ArrayList<String>();
    private ItemFilter mFilter = new ItemFilter();


    public CustomDialogAdapterBasic(Context context, int resource, List<String> listComingIn) {
        super(context, resource);
        this.context = context;
        this.valuesComingIn = listComingIn;
        this.valuesFiltered = listComingIn;
    }


    public void updateBrowser() {
        this.notifyDataSetChanged();
    }

    @Override
    public int getCount() {
        return valuesFiltered.size();
    }

    public String getItem(int position) throws IndexOutOfBoundsException {
        return valuesFiltered.get(position);
    }

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

    @Override
    public boolean isEnabled(int position) {
        return true;
    }



    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.qustom_layout_list, parent, false);
        TextView textView = (TextView) rowView.findViewById(R.id.basic_text_view);

        textView.setTypeface(TypeFaceController.generalTextFace(context));
        textView.setText(getItem(position));
textView.setOnClickListener(new Listener(getItem(position)));
        return rowView;
    }

    public Filter getFilter() {
        return mFilter;
    }

    class Listener implements View.OnClickListener
    {
    String textData;
    Listener(String textData)
    {
    this.textData = textData;
    }

     @Override
        public void onClick(View v) {
          // Implement your click functionality here and call any method of activity like this
          // ((ActivityName)context).methodName();
        }
    }

    private class ItemFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {

            String filterString = constraint.toString().toLowerCase();
            Log.e("filterString", filterString);

            FilterResults results = new FilterResults();

            final List<String> list = valuesComingIn;

            int count = list.size();
            final ArrayList<String> nlist = new ArrayList<String>(count);

            String filterableString ;

            for (int i = 0; i < count; i++) {
                filterableString = list.get(i);
                if (filterableString.toLowerCase().contains(filterString)) {
                    nlist.add(filterableString);
                }
            }

            results.values = nlist;
            results.count = nlist.size();

            return results;
        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint, FilterResults results) {
            valuesFiltered = (ArrayList<String>) results.values;
            notifyDataSetChanged();
        }

    }

}

这篇关于执行搜索后的ListView setOnItemClickListener不工作的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
相关文章
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆