【问题标题】:How to display a listview with only matched items while typing than all (unmatched)items at once?如何在一次输入所有(不匹配的)项目时显示仅包含匹配项目的列表视图?
【发布时间】:2016-08-16 08:15:15
【问题描述】:

列表加载所有字符串,匹配时显示匹配项。但是,我希望该列表仅在输入搜索时显示,并且该列表仅包含搜索的项目。

package com.example.searchlistview;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;

public class MainActivity extends Activity implements SearchView.OnQueryTextListener {

    private static final String TAG = "SearchViewFilterMode";

    private SearchView mSearchView;
    String data,temp,users;
    private ListView mListView;
    private ArrayAdapter<String> mAdapter;

    private final ArrayList<String> mstrings_arr=new ArrayList<String>(); 
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

        setContentView(R.layout.activity_main);

        mSearchView = (SearchView) findViewById(R.id.search_view);
        mListView = (ListView) findViewById(R.id.list_view);



        try
        {
            ThreadPolicy policy = new ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

            HttpClient client=new DefaultHttpClient();                  
            HttpPost post=new HttpPost("http://192.162.1.126:1234/www/search_reg_users.php");

            HttpResponse res=client.execute(post);
            InputStream inp=res.getEntity().getContent();
            BufferedReader bf=new BufferedReader(new InputStreamReader(inp));

            //since this much code of Buffered reader alone wont get , complete data , therefore , we add the below code

            data="";
            temp="";

            while((temp=bf.readLine())!=null)
            {
                data=data+temp;
            }

            JSONArray array=new JSONArray(data);

            for(int i=0;i<array.length();i++)
            {
                JSONObject object=array.getJSONObject(i);

                users=object.getString("username"); 
                mstrings_arr.add(users);
                Toast.makeText(getApplicationContext(),users+" added to list",Toast.LENGTH_SHORT).show();

            }
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }





        mListView.setAdapter(mAdapter = new ArrayAdapter<String>(this,
                android.R.layout.simple_list_item_1,
                mstrings_arr));
        mListView.setTextFilterEnabled(true);
        setupSearchView();
    }

    private void setupSearchView() {
        mSearchView.setIconifiedByDefault(false);
        mSearchView.setOnQueryTextListener(this);
        mSearchView.setSubmitButtonEnabled(false);
        mSearchView.setQueryHint(getString(R.string.cheese_hunt_hint));
    }

    public boolean onQueryTextChange(String newText) {
        if (TextUtils.isEmpty(newText)) {
            mListView.clearTextFilter();
        } 

在上面的代码之后,我尝试将列表视图的可见性设置为仅在找到匹配项时才可见。它仅适用于一个搜索实例,如果找到匹配项,则返回整个列表。

我想得到什么,如下:

  1. 在搜索框中输入搜索
  2. 如果该搜索匹配列表项中的任何项
  3. ONLY THEN列表显示,但只有匹配项

否则 {

            mListView.setFilterText(newText.toString());
            mListView.setVisibility(View.VISIBLE);
        }
    return true;
}

public boolean onQueryTextSubmit(String query) {
    return false;
}

}

【问题讨论】:

  • 提示:在您的列表中搜索更改数据并通知。

标签: java android listview android-arrayadapter searchview


【解决方案1】:

AutoCompleteTextView终于达到了目的

package com.example.searchlistview;

import java.io.BufferedReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.util.ArrayList;

import org.apache.http.HttpResponse;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONArray;
import org.json.JSONObject;

import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.os.StrictMode;
import android.os.StrictMode.ThreadPolicy;
import android.text.Layout;
import android.text.TextUtils;
import android.view.View;
import android.view.Window;
import android.widget.ArrayAdapter;
import android.widget.AutoCompleteTextView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.Toast;

//public class MainActivity extends Activity implements SearchView.OnQueryTextListener {
public class MainActivity extends Activity{

    private static final String TAG = "SearchViewFilterMode";

    private SearchView mSearchView;
    String data,temp,users;
    private ListView mListView;

    private final ArrayList<String> mstrings_arr=new ArrayList<String>(); 


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        getWindow().requestFeature(Window.FEATURE_ACTION_BAR);

        setContentView(R.layout.activity_main);
        ArrayAdapter<String> mAdapter=new ArrayAdapter<String>(this, android.R.layout.select_dialog_item,mstrings_arr);

        mSearchView = (SearchView) findViewById(R.id.search_view);
        mListView = (ListView) findViewById(R.id.list_view);



        try
        {
            ThreadPolicy policy = new ThreadPolicy.Builder().permitAll().build();
            StrictMode.setThreadPolicy(policy);

            HttpClient client=new DefaultHttpClient();                  


            HttpPost post=new HttpPost("http://192.168.1.16:1234/www/search_reg_users.php");


            HttpResponse res=client.execute(post);
            InputStream inp=res.getEntity().getContent();
            BufferedReader bf=new BufferedReader(new InputStreamReader(inp));

            //since this much code of Buffered reader alone wont get , complete data , therefore , we add the below code

            data="";
            temp="";

            while((temp=bf.readLine())!=null)
            {
                data=data+temp;
            }

            JSONArray array=new JSONArray(data);

            for(int i=0;i<array.length();i++)
            {
                JSONObject object=array.getJSONObject(i);

                users=object.getString("username"); 
                mstrings_arr.add(users);
                Toast.makeText(getApplicationContext(),users+" added to list",Toast.LENGTH_SHORT).show();

            }
        }

        catch(Exception e)
        {
            e.printStackTrace();
        }


        //AutoCompleteSearchView

        AutoCompleteTextView actv= (AutoCompleteTextView)findViewById(R.id.autoCompleteTextView1);  
        actv.setThreshold(1);//will start working from first character  
        actv.setAdapter(mAdapter);//setting the adapter data into the AutoCompleteTextView  
        actv.setTextColor(Color.RED);  

    }

XML ,同样是:

<AutoCompleteTextView  
    android:id="@+id/autoCompleteTextView1"  
    android:layout_width="wrap_content"  
    android:layout_height="wrap_content"  
    android:layout_alignParentLeft="true"  
    android:layout_marginLeft="36dp"  
    android:layout_marginTop="17dp"  
    android:ems="10"  
    android:text="">  

    <requestFocus />  
</AutoCompleteTextView>  

【讨论】:

    【解决方案2】:

    您需要使用 addTextChangedListener 来解决您的问题。我做过类似的事情。

    addTextChangedListener(new TextWatcher() {
    
                @Override
                public void afterTextChanged(Editable s) {
                }
    
                @Override
                public void beforeTextChanged(CharSequence s, int start, int count, int after) {
                }
    
                @Override
                public void onTextChanged(CharSequence s, int start,
                                          int before, int count) {
                    if (s.length() != 0) {
                    }
                }
            });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-28
      • 1970-01-01
      相关资源
      最近更新 更多