nes
nes

Reputation: 81

Android ListView API - Search List

maybe someone can help, I need to search through listView with retrieved API data with e.g. http://xx.yy/xy/?search=zz/

My LoadJSON class looks like this:

...
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();
    }
}

and MainActivity.java is here:

...
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);

    }
}

So, where and how I can here implement search view, and how that would look like? Thanks in advance! :)

Upvotes: 0

Views: 1536

Answers (1)

Divyesh Patel
Divyesh Patel

Reputation: 2576

Use this in activity SAMPLE CODE, CHANGE BASED ON YOUR NEED:

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

Create 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>

Upvotes: 1

Related Questions