0

This is my app when I start it:

When I click one of the item in the list view it will open a new activity and display some data.

When I search for something it looks like this:

And when I click an item in the list it starts a new activity. But the activity it starts is not accurate.

Here's my code:

HomeActivity.class

package com.thesis.herbalmedicines.activity;

import java.util.ArrayList;
import java.util.Arrays;

import android.app.Activity;
import android.content.Intent;
import android.content.res.TypedArray;
import android.graphics.Color;
import android.graphics.drawable.ColorDrawable;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SearchView;
import android.widget.TextView;
import android.widget.Toast;

public class HomeActivity extends BaseActivity implements
        SearchView.OnQueryTextListener {

    ListView lv;
    SearchView search;

    String[] herb_names, sample_arr; //= ["Boils","",""];//, iso_codes;
    TypedArray herb_pics;

    ArrayList<Home> homelist;
    HomeAdapter adapter;



    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        getLayoutInflater().inflate(R.layout.home_layout, frameLayout);

        mDrawerList.setItemChecked(position, true);
        setTitle(listArray[position]);

        android.app.ActionBar ab = getActionBar(); 
        ColorDrawable colorDrawable = new ColorDrawable(Color.parseColor("#50B222"));     
        ab.setBackgroundDrawable(colorDrawable);


        lv = (ListView) findViewById(R.id.list_view);
        search = (SearchView) findViewById(R.id.search_view);

        herb_names = getResources().getStringArray(R.array.herb_names);
        //iso_codes = getResources().getStringArray(R.array.iso_Code);
        herb_pics = getResources().obtainTypedArray(R.array.herb_pics);

        homelist = new ArrayList<Home>();
        for (int i = 0; i < herb_names.length; i++) {
            Home home = new Home(herb_names[i], //iso_codes[i],
                    herb_pics.getResourceId(i, -1));
            homelist.add(home);
        }

        adapter = new HomeAdapter(getApplicationContext(), homelist);
        lv.setAdapter(adapter);

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

                if (position == 0) {
                    Intent a = new Intent(HomeActivity.this, Boils.class);
                    startActivity(a);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }

                else if (position == 1) {
                    Intent b = new Intent(HomeActivity.this, Cystitis.class);
                    startActivity(b);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }

                else if (position == 2) {
                    Intent c = new Intent(HomeActivity.this, Asthma.class);
                    startActivity(c);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }
                else if (position == 3) {
                    Intent d = new Intent(HomeActivity.this, Feet.class);
                    startActivity(d);

                    /** Fading Transition Effect */
                    HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
                }



            }
        });
        search.setOnQueryTextListener(this);
    }

    @Override
    public boolean onQueryTextChange(String newText) {
        adapter.getFilter().filter(newText);
        return false;
    }

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



}

Home.java

package com.thesis.herbalmedicines.activity;

public class Home {

    String name;
    int pics;
    Home(String name, int pics) {
        this.name = name;
        this.pics = pics;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getPics() {
        return pics;
    }

    public void setPics(int pics) {
        this.pics = pics;
    }

}

HomeAdapter.java

package com.thesis.herbalmedicines.activity;

import java.util.ArrayList;

import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.Filter;
import android.widget.Filterable;
import android.widget.ImageView;
import android.widget.TextView;

public class HomeAdapter extends BaseAdapter implements Filterable {

    Context context;
    ArrayList<Home> homelist;
    ArrayList<Home> mStringFilterList;
    ValueFilter valueFilter;

    HomeAdapter(Context context, ArrayList<Home> homelist) {
        this.context = context;
        this.homelist = homelist;
        mStringFilterList = homelist;
    }

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

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

    @Override
    public long getItemId(int position) {
        return homelist.indexOf(getItem(position));
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater mInflater = (LayoutInflater) context
                .getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

        convertView = null;
        if (convertView == null) {
            convertView = mInflater.inflate(R.layout.list_item, null);

            TextView name_tv = (TextView) convertView.findViewById(R.id.name);
            ImageView iv = (ImageView) convertView.findViewById(R.id.pic);

            Home home = homelist.get(position);

            name_tv.setText(home.getName());
            iv.setImageResource(home.getPics());
        }
        return convertView;
    }

    @Override
    public Filter getFilter() {
        if (valueFilter == null) {
            valueFilter = new ValueFilter();
        }
        return valueFilter;
    }

    private class ValueFilter extends Filter {
        @Override
        protected FilterResults performFiltering(CharSequence constraint) {
            FilterResults results = new FilterResults();

            if (constraint != null && constraint.length() > 0) {
                ArrayList<Home> filterList = new ArrayList<Home>();
                for (int i = 0; i < mStringFilterList.size(); i++) {
                    if ((mStringFilterList.get(i).getName().toUpperCase())
                            .contains(constraint.toString().toUpperCase())) {

                        Home home = new Home(mStringFilterList.get(i)
                                .getName(), mStringFilterList.get(i)
                                .getPics());

                        filterList.add(home);
                    }
                }
                results.count = filterList.size();
                results.values = filterList;
            } else {
                results.count = mStringFilterList.size();
                results.values = mStringFilterList;
            }
            return results;

        }

        @SuppressWarnings("unchecked")
        @Override
        protected void publishResults(CharSequence constraint,
                FilterResults results) {
            homelist = (ArrayList<Home>) results.values;
            notifyDataSetChanged();
        }

    }

}

3 Answers3

0

Set adpter to listview on every onSerch

Eranga Gamagedara
  • 536
  • 1
  • 3
  • 10
0

Why do you use position to navigate to different activity ?

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

            if (position == 0) {
                Intent a = new Intent(HomeActivity.this, Boils.class);
                startActivity(a);

                /** Fading Transition Effect */
                HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            }

            else if (position == 1) {
                Intent b = new Intent(HomeActivity.this, Cystitis.class);
                startActivity(b);

                /** Fading Transition Effect */
                HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            }

            else if (position == 2) {
                Intent c = new Intent(HomeActivity.this, Asthma.class);
                startActivity(c);

                /** Fading Transition Effect */
                HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            }
            else if (position == 3) {
                Intent d = new Intent(HomeActivity.this, Feet.class);
                startActivity(d);

                /** Fading Transition Effect */
                HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
            }



        }
    });
    search.setOnQueryTextListener(this);
}

This will always reset your position whenever you adapter refresh from search result.

To do this in better way. Just create custom listener like following in your adapter.

Public interface ListViewClick{
  void onListClick(Object type)
}

Register your receiver in activity and pass type of activity to launch from adapter

  private ListViewClick callback;
  HomeAdapter(Context context, ArrayList<Home> homelist,ListViewClick callback) {
        this.context = context;
        this.homelist = homelist;
        mStringFilterList = homelist;
        this.callback = callback;
    }

and on click listener of convertView pass callback.onListClick(//type of activity to launch).

Just keep reference of 'type of activity to launch in Home enitity'. so you can recognize which activity is ti be launch when clicking on particular row of list view.

Krunal Dave
  • 113
  • 8
0

Add a field that holds the class to be loaded inside the Home class. (The id field is optional)

public class Home {
    int id;
    String name;
    int pics;
    Class clazz;

    Home(int id, String name, int pics, Class clazz) {
        this.id = id;
        this.name = name;
        this.pics = pics;
        this.clazz = clazz;
    }
    // getters and setters
}

During initialization of the homelist add the id,

// the classed to load
Class[] classes = {
    Boils.class,
    Cystitis.class,
    Asthma.class,
    Feet.class
};

for (int i = 0; i < herb_names.length; i++) {
    Home home = new Home(i, herb_names[i], herb_pics.getResourceId(i, -1), classes[i]);
    homelist.add(home);
}

Inside the setOnItemClickListener,

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

        Home item = (Home) adapter.getItem(position);

        Intent d = new Intent(HomeActivity.this, item.getClazz());
        startActivity(d);

        /** Fading Transition Effect */
        HomeActivity.this.overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out);
    }
});

Couple of changes should be made in your adapter as well.

Inside the getView you are forcing the convertView to null. It is bad for performance. (Consider using a ViewHolder too)

@Override
public View getView(int position, View convertView, ViewGroup parent) {

    LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);

    if (convertView == null) {
        convertView = mInflater.inflate(R.layout.list_item, null);
    }

    TextView name_tv = (TextView) convertView.findViewById(R.id.name);
    ImageView iv = (ImageView) convertView.findViewById(R.id.pic);

    Home home = homelist.get(position);

    name_tv.setText(home.getName());
    iv.setImageResource(home.getPics());

    return convertView;
}

Inside publishResults you are creating a new reference for the dataset. You should update the existing dataset.

@Override
protected void publishResults(CharSequence constraint,  FilterResults results) {
    homelist.clear();
    homelist.addAll((ArrayList<Home>) results.values);
    notifyDataSetChanged();
}
K Neeraj Lal
  • 6,768
  • 3
  • 24
  • 33
  • I have done what you have said, it shows no error in eclipse(IDE that I'm using) but when I start the app, it shows the unfortunately stop message. How can I fix this.? – user7336661 Jan 02 '17 at 07:11
  • Heres the link of my updated files, 1. [Home.java](https://drive.google.com/file/d/0BxQrW6aKuoE1Ym0xU0U4NUJKM0E/view?usp=sharing) 2. [HomeActivity.java](https://drive.google.com/file/d/0BxQrW6aKuoE1TWxCMkhYNjJqZm8/view?usp=sharing) 3. [HomeAdapter.java](https://drive.google.com/file/d/0BxQrW6aKuoE1T2xuZU0wa3pmREU/view?usp=sharing) – user7336661 Jan 02 '17 at 07:15
  • This is my logcat [logcat1pic](https://drive.google.com/open?id=0BxQrW6aKuoE1bkR6eFNLc0o1ZFE) logcat [logcat2pic](https://drive.google.com/open?id=0BxQrW6aKuoE1NDdHV3lldDBzU3c) – user7336661 Jan 02 '17 at 08:59
  • Make sure `herb_names` and `classes` have same length! So that each herb has an `Activity` to display. – K Neeraj Lal Jan 02 '17 at 09:25