2016-04-22 72 views
-3

該列表將加載所有字符串,並在匹配時顯示匹配的項目。但是,我希望該列表僅在輸入搜索時才顯示,而列表僅包含搜索的項目。如何在打字時僅顯示匹配項目的列表視圖,而不是一次顯示所有項目(不匹配項目)?

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. 任何項目相匹配, 列表顯示只有匹配項目

其他{

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

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

}

+0

提示:在列表中搜索更改數據並通知。 –

回答

0

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) { 
       } 
      } 
     });