【问题标题】:Searchview with listview didn't work properly带有列表视图的搜索视图无法正常工作
【发布时间】:2017-09-17 15:12:21
【问题描述】:

我有一个片段活动。我在它上面实现了一个搜索视图,它的项目是从作为列表视图列出的 firebase 加载的。当我等待一段时间并加载数据时它会起作用。但是,当我在加载发生之前立即单击 searchview 时,即使经过很长时间也没有加载任何数据。然后当我回到主片段并再次返回时立即加载数据。我认为这是一个小问题,但是我是android开发的初学者,所以对我来说很难。这是我的代码:

public class FragmentHome extends Fragment {
private SearchView search;
View view;
DatabaseReference dataRef;
private  FirebaseListAdapter<String> firebaseListAdapter;
ListView mListView;
private TextView text;
ArrayList<String> city=new ArrayList<String>();
private int i=0;
private String data,val,var;
ArrayAdapter<String> adapter;
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable final Bundle savedInstanceState) {
    View v= inflater.inflate(R.layout.activity_fragment_home,container,false);
    if (container!=null){
        container.removeAllViews();
    }
    search= (SearchView) v.findViewById(R.id.search);
    search.onActionViewExpanded();
    search.setIconified(false);
    search.setQueryHint("Search Docter By City Or Department");
    mListView= (ListView) v.findViewById(R.id.mList);
    mListView.setVisibility(View.INVISIBLE);
    dataRef=FirebaseDatabase.getInstance().getReference().child("Docters");
    adapter=new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, city);
    mListView.setAdapter(adapter);
    dataRef.addChildEventListener(new ChildEventListener() {
        @Override
        public void onChildAdded(DataSnapshot dataSnapshot, String s) {
            data=dataSnapshot.child("city").getValue(String.class);
            val=dataSnapshot.child("department").getValue(String.class);
            if (!city.contains(data)){
                city.add(data);
            }
            if (!city.contains(val)){
                city.add(val);
            }
            adapter.notifyDataSetChanged();

        }
        @Override
        public void onChildChanged(DataSnapshot dataSnapshot, String s) {
            data=dataSnapshot.child("city").getValue(String.class);
            val=dataSnapshot.child("department").getValue(String.class);
            city.add(data);
            city.add(val);
            city.add(var);
            adapter.notifyDataSetChanged();
        }

        @Override
        public void onChildRemoved(DataSnapshot dataSnapshot) {

        }

        @Override
        public void onChildMoved(DataSnapshot dataSnapshot, String s) {
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });
    search.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
        @Override
        public boolean onQueryTextSubmit(String text) {

            return false;
        }

        @Override
        public boolean onQueryTextChange(String text) {
            if (!text.isEmpty()){
            mListView.setVisibility(View.VISIBLE);
                adapter.getFilter().filter(text);
            }else{
                mListView.setVisibility(View.INVISIBLE);
            }
            return false;
        }

    });

    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            String itemRef = (String) adapter.getItem(position);
            search.setVisibility(View.INVISIBLE);
            mListView.setVisibility(View.INVISIBLE);
            FragmentTransaction ft=getChildFragmentManager().beginTransaction();
            DocterList fragment=new DocterList();
            Bundle item=new Bundle();
            item.putString("item",itemRef);
            fragment.setArguments(item);
            ft.replace(R.id.activity_fragment_home,fragment);
            ft.addToBackStack(null);
            ft.setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
            ft.commit();
        }
    });
    return v;
  }}

如果有人知道如何解决这个问题,请帮助我。提前谢谢...

【问题讨论】:

    标签: android listview android-fragments firebase searchview


    【解决方案1】:

    像这样在你的适配器中做一个方法过滤器

    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        contactList.clear();
        if (charText.length() == 0) {
            contactList.addAll(contactListFiler);
        }else{
            for (Contacts contact : contactListFiler)
            {
                if (contact.getNumber().toLowerCase(Locale.getDefault()).contains(charText.toLowerCase(Locale.getDefault())))
                if (contact.getContact_name().toLowerCase(Locale.getDefault()).contains(charText.toLowerCase(Locale.getDefault())))
                {
                    contactList.add(contact);
                }
            }
        }
        notifyDataSetChanged();
    }
    

    现在通过实现从您的活动或片段中调用它

    edittext_searchname.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) {
                String str = edittext_searchname.getText().toString().toLowerCase(Locale.getDefault());
                adapter.filter(str);
            }
        });
    

    【讨论】:

      猜你喜欢
      • 2017-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-11
      • 2017-04-24
      • 1970-01-01
      • 1970-01-01
      • 2015-01-09
      相关资源
      最近更新 更多