【问题标题】:Android Custom ListView search with CheckBoxes , Filter is not Working使用 CheckBoxes 进行 Android 自定义 ListView 搜索,过滤器不起作用
【发布时间】:2017-07-27 17:35:46
【问题描述】:

我正在开发 Android 应用程序,我有一个带有复选框的自定义列表视图,我可以选择复选框并获取选定的值。但是当我尝试搜索某些特定名称时应用程序崩溃。

这是我的代码,我想我遗漏了一些东西。

public class MyAdapter extends BaseAdapter {
    private ArrayList<InfoRowdata> arraylisto;
    private List<InfoRowdata> worldlist = null;

    Context mContext;
    LayoutInflater inflater;

    public MyAdapter(Context context, List<InfoRowdata> worldpopulationlist) {
        mContext = context;
        inflater = LayoutInflater.from(mContext);
        this.worldlist = worldpopulationlist;

        this.arraylisto = new ArrayList<InfoRowdata>();
        this.arraylisto.addAll(worldpopulationlist);

    }

    public class ViewHolder {
        TextView Name;
        CheckBox cb;

    }
    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        return data.length;
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return worldlist.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

 public View getView(final int position, View view, ViewGroup parent) {
final ViewHolder holder;
if (view == null) {
    holder = new ViewHolder();
    view = inflater.inflate(R.layout.creditunionrow, null);
    // Locate the TextViews in listview_item.xml
    holder.Name = (TextView) view.findViewById(R.id.label);
    holder.cb = (CheckBox) view.findViewById(R.id.check);

    view.setTag(holder);
} else {
    holder = (ViewHolder) view.getTag();
}
// Set the results into TextViews
holder.Name.setText(worldlist.get(position).getName());
 // holder.cb.setChecked(worldlist.get(position).getChecked());


holder.cb.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        Selection = "";
                count=0;
                String selecteditems = "";
                // TODO Auto-generated method stub
                if (infodata.get(position).isclicked) {
                    infodata.get(position).isclicked = false;

                } else {
                    infodata.get(position).isclicked = true;
                }
                for (int i = 0; i < infodata.size(); i++) {
                    if (infodata.get(i).isclicked) {
                   //System.out.println("Selectes Are == "+ data[i]);
                        selecteditems = selecteditems + data[i] + ",";
                    count++;
                    }
                }
                System.out.println("Selected Are == " + selecteditems);
                Selection = selecteditems;
            }



});
if (infodata.get(position).isclicked) {

    holder.cb.setChecked(true);
} else {
    holder.cb.setChecked(false);
}




// Listen for ListView Item Click
view.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View arg0) {

    }
});

return view;
}

    // Filter Class
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        worldlist.clear();
        if (charText.length() == 0) {
            worldlist.addAll(arraylisto);
        } else {
            for (InfoRowdata wp : arraylisto) {
                if (wp.getName().toLowerCase(Locale.getDefault())
                        .contains(charText)) {
                    worldlist.add(wp);
                }
            }
        }
        notifyDataSetChanged();
    }

}

这是我的模型类

public class InfoRowdata {

public boolean isclicked=false;
public int index;
public String name;
/*public String strAmount;*/

public InfoRowdata(boolean isclicked,int index,String name/*,String strAmount*/)
{
    this.index=index;
    this.isclicked=isclicked;
    this.name=name;
    /*this.strAmount=strAmount;*/
}


public String getName() {
    return this.name;
}

public void setName(String name) {
    this.name = name;
}


public Boolean getChecked() {
    return isclicked;
}

public void setChecked(Boolean checked) {
    this.isclicked = checked;
}

}

我得到的异常:

                                                                   java.lang.IndexOutOfBoundsException: Invalid index 2, size is 2
                                                                       at java.util.ArrayList.throwIndexOutOfBoundsException(ArrayList.java:255)
                                                                       at java.util.ArrayList.get(ArrayList.java:308)
                                                                       at My.Profile.activity.UnionActivity$MyAdapter.getView(UnionActivity.java:240)
                                                                       at android.widget.AbsListView.obtainView(AbsListView.java:2346)
                                                                       at android.widget.ListView.measureHeightOfChildren(ListView.java:1281)
                                                                       at android.widget.ListView.onMeasure(ListView.java:1188)
                                                                       at android.view.View.measure(View.java:18794)
                                                                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                                                                       at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                                                                       at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                                                                       at android.view.View.measure(View.java:18794)
                                                                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                                                                       at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                                                                       at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                                                                       at android.view.View.measure(View.java:18794)
                                                                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                                                                       at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                                                                       at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                                                                       at android.view.View.measure(View.java:18794)
                                                                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                       at android.view.View.measure(View.java:18794)
                                                                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                       at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1465)
                                                                       at android.widget.LinearLayout.measureVertical(LinearLayout.java:748)
                                                                       at android.widget.LinearLayout.onMeasure(LinearLayout.java:630)
                                                                       at android.view.View.measure(View.java:18794)
                                                                       at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:5951)
                                                                       at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                                                                       at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:2643)
                                                                       at android.view.View.measure(View.java:18794)
                                                                       at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2100)
                                                                       at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1216)
                                                                       at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1452)
                                                                       at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1107)
                                                                       at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:6013)
                                                                       at android.view.Choreographer$CallbackRecord.run(Choreographer.java:858)
                                                                       at android.view.Choreographer.doCallbacks(Choreographer.java:670)
                                                                       at android.view.Choreographer.doFrame(Choreographer.java:606)
                                                                       at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:844)
                                                                       at android.os.Handler.handleCallback(Handler.java:739)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:95)
                                                                       at android.os.Looper.loop(Looper.java:148)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5417)
                                                                       at java.lang.reflect.Method.invoke(Native Method)
                                                                       at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:726)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:616)

这就是我使用edittext搜索列表视图的方式:

inputSearch.addTextChangedListener(new TextWatcher()
    {
        public void afterTextChanged(Editable s)
        {
            //Abstract Method of TextWatcher Interface.
        }
        public void beforeTextChanged(CharSequence s,int start, int count, int after)
        {

        }
        public void onTextChanged(CharSequence s,int start, int before, int count)
        {



            String text = inputSearch.getText().toString().toLowerCase(Locale.getDefault());
            adapter.filter(text);
        }
    });

我不知道我在哪里遗漏了一些东西,我想检查随机复选框,并通过正确引用选中的复选框对它们进行搜索,首先我没有使用自定义适配器,在那里搜索很好,但我丢失了应用搜索时复选框的选中状态,现在我正在使用 customadapter,如何在搜索列表视图时正确引用复选框。我将非常感谢您的帮助,我几乎花了两天时间,搜索了所有互联网,但找不到任何实现带有复选框和搜索功能的列表视图的示例。

【问题讨论】:

  • HII。当用户通过搜索栏搜索时,您是否获得了复选框选择的解决方案。我有一个问题,即当我通过搜索栏搜索联系人时,当我选中该框并删除搜索框中的文本时,联系人显示为复选框,然后复选框被选中联系人列表的第一项而不是选定的联系人。

标签: android listview checkbox baseadapter


【解决方案1】:

java.util.ArrayList.addAll(Collection c) 方法 将指定集合中的所有元素附加到 此列表,按照指定的返回顺序 集合的迭代器。

错误

    this.arraylisto = new ArrayList<InfoRowdata>();
    this.arraylisto.addAll(worldpopulationlist); // Problem Here

正确

this.arraylisto = new ArrayList<InfoRowdata>();
this.arraylisto.addAll(worldlist); // Rectify here

 @Override
public int getCount() {
    // TODO Auto-generated method stub
    return worldlist.size();
}

【讨论】:

  • 这很好用,现在我没有遇到任何异常,搜索正常,非常感谢。但我仍然对复选框的选中状态有疑问,如果你能给出任何提示如何在搜索时跟踪选中的复选框
  • @Intellij Amiya .HII。当用户通过搜索栏搜索时,我遇到了复选框选择的问题。我有一个问题,当我通过搜索栏搜索联系人时,当我选中该框并删除搜索框中的文本时,联系人显示为复选框,然后复选框被选中联系人列表的第一项而不是选定的联系人。你有没有建议重新评分
【解决方案2】:

首先不要在CheckBox 上使用onClickListener 使用setOnCheckedChangeListener,其次你有空列表尝试@IntelliJ Amiya 答案

【讨论】:

    猜你喜欢
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多