1

Am trying search from listview using custom adapter. i have search widget in toolbar menu and i can display widget. when i click on search icon, it expands, but when i start typing, search does not happen and list gets cleared. can someone plz trace this issue .

Here's my code from Main Activity:

    public class VideoActivity extends BaseActivity {
    ListView listView;
    ArrayList<Video> videoArrayList;
    public VideoListAdapter videoListAdapter;

    String vid_id, vid_title, vid_type, vid_path, vid_img;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_video);

        initializeToolbar();

        listView = (ListView) findViewById(R.id.listview_video);
        videoArrayList = new ArrayList<Video>();
        videoListAdapter = new VideoListAdapter(VideoActivity.this, videoArrayList);

        jsonParser = new JSONParser();

        new VideoTask().execute();

    public class VideoTask extends AsyncTask<String, String, JSONObject> {

        @Override
        protected JSONObject doInBackground(String... strings) {
            jsonObject = jsonParser.makeHttpRequest2(Network_constants.video_list_page, "POST");

            Log.e("json data", "" + jsonObject);

            return jsonObject;
        }


        @Override
        protected void onPostExecute(JSONObject jsonObject) {
            super.onPostExecute(jsonObject);
            progressDialog.dismiss();
            if (jsonObject != null) {
                try {
                    jsonArray = jsonObject.getJSONArray("videos");
                    for (int i = 0; i < jsonArray.length(); i++) {
                        JSONObject jsonObject1 = jsonArray.getJSONObject(i);
                        Log.d("jsonObject1", "" + jsonObject1);

                        Video video = new Video();

                        vid_id = jsonObject1.getString("video_id");
                        vid_title = jsonObject1.getString("video_channel_name");
                        vid_type = jsonObject1.getString("video_channel_link");
                        vid_path = jsonObject1.getString("video_channel_description");
                        vid_img = jsonObject1.getString("video_img_path");

                        video.set_vTitle(vid_title);

                        TextView t1 = (TextView) findViewById(R.id.video_title);
                        TextView t2 = (TextView) findViewById(R.id.video_type);

                        video.set_vArtist(vid_title);
                        video.set_vType(vid_type);

                        videoArrayList.add(video);
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }

                listView.setAdapter(videoListAdapter);
                listView.setTextFilterEnabled(true);
                listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
                    @Override
                    public void onItemClick(AdapterView<?> parent, View view, int position, long id) {


                        TextView cnt = (TextView) view.findViewById(R.id.video_type);
                        String cn = cnt.getText().toString();

                        Intent i = new Intent(VideoActivity.this, Youtube.class);
                        i.putExtra("url", cn);
                        startActivity(i);
                    }
                });
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        super.onCreateOptionsMenu(menu);
        menu.clear();
        getMenuInflater().inflate(R.menu.main,menu);

        MenuItem menuItem = menu.findItem(R.id.menu_search);
        final SearchView searchView = (SearchView) menuItem.getActionView();

        searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
            @Override
            public boolean onQueryTextSubmit(String query) {
                return false;
            }

            @Override
            public boolean onQueryTextChange(String newText) {
                if(TextUtils.isEmpty(newText)){
                    LogHelper.e("Query Result","Filter is Empty");
                }else{
                    videoListAdapter.filter(newText);
                }
                return true;
            }
        });

        return true;
    }
}

And this is my CustomAdapter class :

    public class VideoListAdapter extends BaseAdapter {
    private Activity activity;
    private static LayoutInflater inflater = null;
    ImageView imageView;
    private String mCurrentArtUrl;
    private ArrayList<Video> video;
    private ArrayList<Video> searchListView = null;



    public VideoListAdapter(Activity a, ArrayList<Video> b){

        this.activity = a;
        this.video = b;
        this.searchListView = new ArrayList<Video>();
        this.searchListView.addAll(video);
        inflater = (LayoutInflater) activity.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

    }

    @Override
    public int getCount() {
        return video.size();
    }

    @Override
    public Object getItem(int position) {
        return video.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(final int position, View convertView, ViewGroup parent) {
        View vi = convertView;
        if (convertView == null)
            vi = inflater.inflate(R.layout.video_list_item, null);

        final TextView v_title = (TextView)vi.findViewById(R.id.video_title);
        final TextView v_type = (TextView)vi.findViewById(R.id.video_type);
        final TextView v_artist = (TextView)vi.findViewById(R.id.video_artist);
        imageView = (ImageView) vi.findViewById(R.id.video_image);

        Video video1 = video.get(position);

        v_title.setText(video1.get_vTitle());
        v_type.setText(video1.get_vType());
        v_artist.setText(video1.get_vArtist());

        String img = video1.get_vImage();
        String profile = Network_constants.image_url + img;
        fetchImageAsync(profile);

        return vi;
    }

    // Filter method
    public void filter(String charText) {
        charText = charText.toLowerCase(Locale.getDefault());
        video.clear();

        if(charText.length() == 0){
            video.addAll(searchListView);
        }else{
            for(Video v : searchListView){
                LogHelper.e("Query","Entered For Loop");
                    if(v.get_vTitle().contains(charText)){
                        video.add(v);
                }else{
                    LogHelper.e("Query","Could not create list");
                }

            }
        }
        notifyDataSetChanged();
    }
}

I think my code is not working with the for loop in the filter function i guess.

1

1 Answer 1

1

You should implements Filterable in your Adapter

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.