2015-04-23 43 views
0

1.我的搜索功能只適用於filter int(例如:rank)如果我想過濾char(例如:country name),應該如何更改此代碼?Android JSON列表視圖搜索功能(更新)

2.當我在mEdittext中輸入某些內容而不是刪除它時,listview變爲空,如果mEdittext爲空,我怎麼能再次看到json listview?

對於現在的過濾器工作正常,我只是無法弄清楚如何解決這兩個question.thanks

import android.app.Activity; 
import android.app.ProgressDialog; 
import android.os.AsyncTask; 
import android.os.Bundle; 
import android.text.Editable; 
import android.text.TextWatcher; 
import android.util.Log; 
import android.widget.EditText; 
import android.widget.ListView; 

import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 

import java.util.ArrayList; 
import java.util.HashMap; 

public class MainActivity extends Activity { 
    // Declare Variables 
    JSONObject jsonobject; 
    JSONArray jsonarray; 
    ListView listview; 
    ListViewAdapter adapter; 
    ProgressDialog mProgressDialog; 
    ArrayList<HashMap<String, String>> arraylist; 
    static String RANK = "rank"; 
    static String COUNTRY = "country"; 
    static String POPULATION = "population"; 
    static String URL="url"; 
    static String FLAG = "flag"; 
    EditText mEditText; 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     // Get the view from listview_main.xml 
     setContentView(R.layout.listview_main); 
     // Execute DownloadJSON AsyncTask 
     new DownloadJSON().execute(); 




     mEditText = (EditText) findViewById(R.id.inputSearch); 
     mEditText.addTextChangedListener(new TextWatcher() { 

      public void afterTextChanged(Editable s) { 

      } 

      public void beforeTextChanged(CharSequence s, int start, int count, int after) { 

      } 

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

        ArrayList<HashMap<String, String>> arrayTemplist = new ArrayList<HashMap<String, String>>(); 
        String searchString = mEditText.getText().toString(); 
        for (int i = 0; i < arraylist.size(); i++) { 
         String currentString = arraylist.get(i).get(MainActivity.RANK); 
         if (searchString.equalsIgnoreCase(currentString)) { 
          arrayTemplist.add(arraylist.get(i)); 
         } 

        } 
        adapter = new ListViewAdapter(MainActivity.this, arrayTemplist); 
        listview.setAdapter(adapter); 

      } 


     }); 
    } 


    // DownloadJSON AsyncTask 
    private class DownloadJSON extends AsyncTask<Void, Void, Void> { 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // Create a progressdialog 
      mProgressDialog = new ProgressDialog(MainActivity.this); 
      // Set progressdialog title 
      mProgressDialog.setTitle("Android JSON Parse Tutorial"); 
      // Set progressdialog message 
      mProgressDialog.setMessage("Loading..."); 
      mProgressDialog.setIndeterminate(false); 
      // Show progressdialog 
      mProgressDialog.show(); 
     } 

     @Override 
     protected Void doInBackground(Void... params) { 
      // Create an array 
      arraylist = new ArrayList<HashMap<String, String>>(); 
      // Retrieve JSON Objects from the given URL address 
      jsonobject = JSONfunctions 
        .getJSONfromURL("http://ndublog.twomini.com/123.txt.txt"); 

      try { 
       // Locate the array name in JSON 
       jsonarray = jsonobject.getJSONArray("worldpopulation"); 

       for (int i = 0; i < jsonarray.length(); i++) { 
        HashMap<String, String> map = new HashMap<String, String>(); 
        jsonobject = jsonarray.getJSONObject(i); 
        // Retrive JSON Objects 
        map.put("rank", jsonobject.getString("rank")); 
        map.put("country", jsonobject.getString("country")); 
        map.put("population", jsonobject.getString("population")); 
        map.put("url",jsonobject.getString("url")); 
        map.put("flag", jsonobject.getString("flag")); 
        // Set the JSON Objects into the array 
        arraylist.add(map); 
       } 
      } catch (JSONException e) { 
       Log.e("Error", e.getMessage()); 
       e.printStackTrace(); 
      } 
      return null; 
     } 

     @Override 
     protected void onPostExecute(Void args) { 
      // Locate the listview in listview_main.xml 
      listview = (ListView) findViewById(R.id.listview); 
      // Pass the results into ListViewAdapter.java 
      adapter = new ListViewAdapter(MainActivity.this, arraylist); 
      // Set the adapter to the ListView 
      listview.setAdapter(adapter); 
      // Close the progressdialog 
      mProgressDialog.dismiss(); 
     } 
    } 



     } 
+0

似乎'adapter'爲空。 –

+0

但適配器爲空? –

+0

嘗試檢查'if(MainActivity.this.adapter!= null){...}' –

回答

0

過濾,必須ListView的適配器上完成,所以onTextChanged,使用adapter01.getFilter().filter(cs);

現在,爲了過濾工作,此適配器必須實現Filterable接口並實現getFilter()方法。

public class ListViewAdapter extends BaseAdapter implements Filterable { 
@Override 
public Filter getFilter() { 
    // TODO Auto-generated method stub 
    return new Filter() { 

     @Override 
     protected void publishResults(CharSequence constraint, FilterResults results) { 
      // publish results here 

     } 

     @Override 
     protected FilterResults performFiltering(CharSequence constraint) { 
      // Add your filtering code and return results 
      return null; 
     } 
    }; 
} 

一個很好的例子可以在下面的鏈接中找到:http://www.survivingwithandroid.com/2012/10/android-listview-custom-filter-and.html

+0

當我將適配器更改爲adapter01時,getFilter()將會(無法解析方法),所以我需要創建另一個名爲ListViewAdapter的java類? – eason

+0

您的ListViewAdapter需要實現Filterable,然後它應該可以訪問getFilter方法。就像我剛纔提到的那樣,鏈接有一個很好描述的例子。 –

+0

FilterResults說'android.widget.Filter.FilterResults'已經在'android.widget.Filter'中保護訪問權限 – eason

0

更改adapteradapter01(該adapter01是初始化的一個)

 @Override 
     public void onTextChanged(CharSequence cs, int arg1, int arg2, int arg3) { 
      // When user changed the Text 
      MainActivity.this.adapter01.getFilter().filter(cs); 
     } 

對於開放現場ListView,創建一個itemClickListener

listview.setOnItemClickListener(new OnItemClickListener() { 
    public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 

     String url = null; 
     for (String s : adapter01.getItems()) { 
      if (s.hashCode() == id) { 
       url = s; 
      } 
     } 
     Intent i = new Intent(Intent.ACTION_VIEW); 
     i.setData(Uri.parse(url)); 
     MainActivity.this.startActivity(i); 

    } 
}); 

並覆蓋適配器中的getItemId()

例子:

protected long getItemId(int position) { 
    return getItem(position).hashCode(); 
} 
+0

當我將adapter改爲adapter01時,getFilter( )將會(無法解析方法) – eason

+0

就像@Jayesh所說:在你的ListView中使類'實現可過濾' –

+0

如果我在過濾項目後點擊項目,listview的項目位置會改變,如果我設置了每一個項目不同的網址,這將是一個錯誤的網站。 – eason