2017-01-09 1 views
0

peut-être que quelqu'un peut aider, j'ai besoin de rechercher dans listView avec des données API récupérées avec, par exemple, http://xx.yy/xy/?search=zz/Android ListView API - Liste de Recherche

Ma classe LoadJSON ressemble à ceci:

... 
import java.net.URL; 
import java.util.List; 

public class LoadJSONTask extends AsyncTask<String, Void, Response> { 

    public LoadJSONTask(Listener listener) { 

     mListener = listener; 
    } 

    public interface Listener { 

     void onLoaded(List<AndroidVersion> androidList); 

     void onError(); 
    } 

    private Listener mListener; 

    @Override 
    protected Response doInBackground(String... strings) { 
     try { 

      String stringResponse = loadJSON(strings[0]); 
      Gson gson = new Gson(); 

      return gson.fromJson(stringResponse, Response.class); 
     } catch (IOException e) { 
      e.printStackTrace(); 
      return null; 
     } catch (JsonSyntaxException e) { 
      e.printStackTrace(); 
      return null; 
     } 
    } 

    @Override 
    protected void onPostExecute(Response response) { 

     if (response != null) { 

      mListener.onLoaded(response.getAndroid()); 

     } else { 

      mListener.onError(); 
     } 
    } 

    private String loadJSON(String jsonURL) throws IOException { 

     URL url = new URL(jsonURL); 
     HttpURLConnection conn = (HttpURLConnection) url.openConnection(); 
     conn.setReadTimeout(10000); 
     conn.setConnectTimeout(15000); 
     conn.setRequestMethod("GET"); 
     conn.setDoInput(true); 
     conn.connect(); 

     BufferedReader in = new BufferedReader(new   InputStreamReader(conn.getInputStream())); 
     String line; 
     StringBuilder response = new StringBuilder(); 

     while ((line = in.readLine()) != null) { 

      response.append(line); 
     } 

     in.close(); 
     return response.toString(); 
    } 
} 

et MainActivity.java est ici:

... 
import java.util.HashMap; 
import java.util.List; 

public class MainActivity extends AppCompatActivity implements  LoadJSONTask.Listener, AdapterView.OnItemClickListener { 

    private ListView mListView; 

    public static final String URL =  "https://api.learn2crack.com/android/jsonandroid/"; 

    private List<HashMap<String, String>> mAndroidMapList = new ArrayList<> (); 

    private static final String KEY_VER = "ver"; 
    private static final String KEY_NAME = "name"; 
    private static final String KEY_API = "api"; 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     mListView = (ListView) findViewById(R.id.list_view); 
     mListView.setOnItemClickListener(this); 
     new LoadJSONTask(this).execute(URL); 
    } 

    @Override 
    public void onLoaded(List<AndroidVersion> androidList) { 

     for (AndroidVersion android : androidList) { 

      HashMap<String, String> map = new HashMap<>(); 

      map.put(KEY_VER, android.getVer()); 
      map.put(KEY_NAME, android.getName()); 
      map.put(KEY_API, android.getApi()); 

      mAndroidMapList.add(map); 
     } 

     loadListView(); 
    } 

    @Override 
    public void onError() { 

     Toast.makeText(this, "Error !", Toast.LENGTH_SHORT).show(); 
    } 

    @Override 
    public void onItemClick(AdapterView<?> adapterView, View view, int i, long  l) { 

     Toast.makeText(this,  mAndroidMapList.get(i).get(KEY_NAME),Toast.LENGTH_LONG).show(); 
    } 

    private void loadListView() { 

     ListAdapter adapter = new SimpleAdapter(MainActivity.this,   mAndroidMapList, R.layout.list_item, 
       new String[] { KEY_VER, KEY_NAME, KEY_API }, 
       new int[] { R.id.version,R.id.name, R.id.api }); 

     mListView.setAdapter(adapter); 

    } 
} 

Alors, où et comment je peux ici mettre en œuvre vue de la recherche, et comment cela regarderait comme? Merci d'avance! :)

+1

classe utilisation de ActionView dans la barre d'outils. et utiliser le widget de recherche v7 –

+0

A fait une chose similaire mais ne fonctionne pas, pouvez-vous s'il vous plaît donner plus de détails ou du code? – nes

+1

attente. Je vous donne le code –

Répondre

1

Utilisez cette activité EXEMPLE DE CODE, CHANGEMENT SUR LA BASE DE VOS BESOINS:

List<GrpModel> grpModels=new ArrayList<>(); 
List<GrpModel> grpModelsSearch=new ArrayList<>(); 


    @Override 
    public boolean onCreateOptionsMenu(final Menu menu) { 

     MenuInflater inflater = getMenuInflater(); 
     inflater.inflate(R.menu.search_view_menu, menu); 
     MenuItem searchItem = menu.findItem(R.id.action_search); 
     final SearchView searchView = (SearchView) MenuItemCompat.getActionView(searchItem); 
     searchView.setQueryHint("Search..."); 



     searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() { 
      @Override 
      public boolean onQueryTextSubmit(String query) { 
       menu.findItem(R.id.action_search).collapseActionView(); 
       return true; 
      } 

      @Override 
      public boolean onQueryTextChange(String newText) { 
       if (newText.length()>0){ 

        grpModels.clear(); 
        for (int s=0;s<grpModelsSearch.size();s++){ 
         final String text=grpModelsSearch.get(s).getName().toLowerCase().trim(); 
         if (text.contains(newText)){ 
          GrpModel gp=new GrpModel(); 
          gp.setGroupID(String.valueOf(grpModelsSearch.get(s).getGroupID())); 
          gp.setName(grpModelsSearch.get(s).getName()); 
          grpModels.add(gp); 
         } 
        } 

        adapter.notifyDataSetChanged(); 
       } 
       else { 

        grpModels.clear(); 

        for (int s=0;s<grpModelsSearch.size();s++){ 
         GrpModel gp=new GrpModel(); 
         gp.setGroupID(String.valueOf(grpModelsSearch.get(s).getGroupID())); 
         gp.setName(grpModelsSearch.get(s).getName()); 
         grpModels.add(gp); 
        } 

        adapter.notifyDataSetChanged(); 

       } 

       return false; 
      } 

     }); 
     return super.onCreateOptionsMenu(menu); 
    } 

Création d'un menu: search_view_menu.xml

<?xml version="1.0" encoding="utf-8"?> 
<menu xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    tools:context=".MainActivity"> 
    <item 
     android:id="@+id/action_search" 
     app:actionViewClass="android.support.v7.widget.SearchView" 
     app:showAsAction="always|collapseActionView" 
     android:icon="@drawable/ic_search_white_24dp" 
     android:title="Search" /> 

</menu> 
+0

Merci, et comment puis-je m'adapter dans mon code pour retourner ceci: http: //xx.yy/xy/? search = zz/au lieu de chercher des données déjà récupérées? – nes

+0

je ne peux pas accéder à cette adresse –

+0

vous devez faire appel api à chaque fois mot-clé type d'utilisateur –