【问题标题】:How can I use filter on listview when type something on Edittext in Android在 Android 中的 Edittext 上键入内容时,如何在 listview 上使用过滤器
【发布时间】:2016-06-23 04:00:03
【问题描述】:

我想通过edittext找出指定用户。然而,edittext 是 ListView 的第一行。 我怎样才能做到这一点?

 public class ChatFragment extends Fragment {
    private ListView chatListView;
    private List<ChatItem> items;
    private ChatAdapter chatAdapter;

    public static ChatFragment newInstance(){
        ChatFragment fragment = new ChatFragment();
        return fragment;
    }

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

    }

    @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle saveInstanceState){
        View view = inflater.inflate(R.layout.chat_fragment, container, false);
        chatListView = (ListView)view.findViewById(R.id.chatListView);
        setupChatList();
        chatListView.setTextFilterEnabled(true);
        return view;
    }

    public void setupChatList(){
        items = new ArrayList<>();
        items.add(new ChatItem(1, "","","",""));
        items.add(new ChatItem(2 ,"layer1", "Chloe Grace Moretz", "Approved your see post request!", "4 mins"));
        items.add(new ChatItem(3 ,"layer2", "Robert Downey", "ok!", "16:19"));
        items.add(new ChatItem(4 ,"layer3", "Amanda Crew", "haha", "19:01"));
        items.add(new ChatItem(5 ,"layer4", "Noah Urrea", "Good choice ~ man", "Yesterday"));
        items.add(new ChatItem(6 ,"layer5", "Blake Rayne", "Jason Papadopoulos I think", "Sunday"));
        chatAdapter = new ChatAdapter(getContext(), items);
        chatListView.setAdapter(chatAdapter);
    }

    public void remove(){
        chatAdapter.remove(items.get(1));
    }
}

我的适配器在下面:

  public class ChatAdapter extends ArrayAdapter<ChatItem> {
    private List<ChatItem> items;
    private List<ChatItem> filteredData = null;
    private TextView chatNameTxt;
    private TextView msgTxt;
    private TextView msgTimeTxt;
    private ImageView chatImg;
    private ImageView chatMoreImg;
    private Context context;
    private ItemFilter filter = new ItemFilter();
    private EditText findChat;

    public ChatAdapter(Context context, List<ChatItem> items){
        super(context, -1, items);
        this.items = items;
        this.context = context;
    }

    @Override public View getView(int position, View convertView, ViewGroup parent){
        LayoutInflater inflater = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        if (position==0){
            View item0 = inflater.inflate(R.layout.chat_list_view_item0, parent, false);
            findChat = (EditText)item0.findViewById(R.id.findChat);
            findChat.addTextChangedListener(new TextWatcher() {
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }

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

                }

                @Override
                public void afterTextChanged(Editable s) {
                    ChatFragment chatFragment = new ChatFragment();
                    chatFragment.remove();
                }
            });
            return item0;
        }else {
            View item = inflater.inflate(R.layout.chat_list_view, parent, false);
            chatNameTxt = (TextView) item.findViewById(R.id.chatNameTxt);
            msgTxt = (TextView) item.findViewById(R.id.msgTxt);
            msgTimeTxt = (TextView) item.findViewById(R.id.msgTimeTxt);
            chatImg = (ImageView)item.findViewById(R.id.chatImg);
            chatMoreImg = (ImageView)item.findViewById(R.id.chatMoreImg);

            ChatItem friendItem = items.get(position);
            String chatName = friendItem.getUserNmae();
            String msg = friendItem.getLastMsg();
            String msgTime = friendItem.getLastMsgTime();
            String userImg = friendItem.getUserImageName();

            chatImg.setImageResource(context.getResources().getIdentifier(userImg, "drawable", context.getPackageName()));
            chatNameTxt.setText(chatName);
            msgTxt.setText(msg);
            msgTimeTxt.setText(msgTime);

            return item;
        }
    }
}

【问题讨论】:

标签: java android listview mobile android-edittext


【解决方案1】:

Filter ListViewEditText 上输入时,您可以按照以下方式进行操作。

  1. TextWatcher 添加到EditText#addTextChangedListener
  2. onTextChanged 中从ListView 的适配器中添加或删除项目。如果您将ArrayAdapter 子类化,它将具有addremove 方法
  3. 如果您是BaseAdapter 的子类化,则生成BaseAdapter implements Filterable

注意:第 2 步:适用于 ArrayAdapter,第 3 步:适用于 BaseAdapter.

【讨论】:

  • 有道理。那么你认为我不需要扩展过滤器吗?
  • @YunyuenChan 看这里很简单的例子你会明白mysamplecode.com/2012/07/android-listview-edittext-filter.html也让你的Adapter extends baseAdapter implements Filterable
  • 好的。我现在试试这个。
  • @YunyuenChan 在此处发布您的代码以及 logcat crash
  • 它在 remove() 处崩溃。
【解决方案2】:

您可以使您的适配器Filterable。它会自动更新列表视图的值。

明天我会在这里写教程,并保留链接以感谢作者。

【讨论】:

  • 它使用了 notifyDataSetChanged();运行后,它将清除第一行,因此 EditText 将被删除。
  • 我希望当用户向下滚动时,搜索 EditText 会上升。所以我让 ListView 的第一行是一个 EditText。
  • 好的。我了解您的需求。然后,您可以将具有垂直方向的 LinearLayout 放入滚动视图中。它将包含 EditText 和列表视图
【解决方案3】:

无需创建额外的过滤器类。您只需保留来自 TextWatcher 的字符串,然后使用包含方法检查该字符串与您的列表视图数据

searchforcategory.addTextChangedListener(new TextWatcher() {
        @Override
        public void beforeTextChanged(CharSequence charSequence, int i, int i1, int i2) {

        }

        @Override
        public void onTextChanged(CharSequence charSequence, int i, int i1, int i2) {
            getAllCetegory(charSequence.toString());

        }

        @Override
        public void afterTextChanged(Editable editable) {



        }
    });

现在只需使用您的数据检查该字符串

 for(int i=0;i<response.body().getDataList().size();i++){

                    if(response.body().getDataList().get(i).getName().contains(checkString)){


                        productDataLists.add(response.body().getDataList().get(i));

                    }


                }

【讨论】:

    猜你喜欢
    • 2010-12-11
    • 2013-06-29
    • 2017-12-12
    • 2013-10-13
    • 1970-01-01
    • 1970-01-01
    • 2012-09-27
    • 1970-01-01
    • 2015-06-21
    相关资源
    最近更新 更多