Reputation: 45
This is my Adapter Class for ListView,
Need Help, I am getting original positions, after filtering the listview, instead positions of filtered result. Code is given below, kindly go through it,if any query kindly ask.
// This is my Adapter Class for ListView
public class mAdapter extends BaseAdapter implements Filterable {
ArrayList<MlaData> dats;
public ArrayList<MlaData> filterList;
enter code here
CustomFilter filter;
Context c;
ImageLoader imageLoader;
public mAdapter(Context ctx,ArrayList<MlaData> dats){
this.c=ctx;
this.dats=dats;
this.filterList = dats;
}
@Override
public int getCount() {
return dats.size();
}
@Override
public Object getItem(int position) {
return dats.get(position);
}
@Override
public long getItemId(int position) {
int itemID;
// orig will be null only if we haven't filtered yet:
if (filterList == null)
{
itemID = position;
}
else
{
itemID = dats.indexOf(dats.get(position));
}
return itemID;
}
@Override
public Filter getFilter() {
if(filter==null)
{
filter = new CustomFilter();
}
return filter;
}
class CustomFilter extends Filter{
@Override
protected FilterResults performFiltering(CharSequence constraint) {
FilterResults results = new FilterResults();
if(constraint!=null && constraint.length()>0)
{
constraint = constraint.toString().toUpperCase();
ArrayList<MlaData> filters = new ArrayList<MlaData>();
//Filtering
for(int i=0;i<filterList.size();i++)
{
if(filterList.get(i).getName().toUpperCase().contains(constraint)){
MlaData MlaDat = new MlaData(filterList.get(i).getName(),filterList.get(i).getImageUrl(),filterList.get(i).getArea(),filterList.get(i).getId(),filterList.get(i).getEmail());
filters.add(MlaDat);
}
results.count=filters.size();
results.values=filters;
}
}else {
results.count=filterList.size();
results.values=filterList;
}
return results;
}@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
dats=(ArrayList<MlaData>)results.values;
notifyDataSetChanged();
}
}
MainActivity.java (Only The ListView OnClick Function) :
private ArrayList<MlaData> MlaDats = new ArrayList<MlaData>();
private String MlaNameString, MlaImageString, MlaIdString, MlaEmailString, MlaAreaString;
private GridView listView;
private mAdapter adapt;
private SearchView sv;
listView = (GridView) findViewById(R.id.mldata);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
int posi = (int) adapt.getItemId(position);
Intent intent = new Intent(Rajasthan_Mla.this, MainActivity.class);
// int pos = (int) adapt.getItemId(position);
String MLAID = MlaDats.get(posi).getId();
String MLANAME = MlaDats.get(posi).getName();
String MLAEMAIL = MlaDats.get(posi).getEmail();
String MLAIMAGE = MlaDats.get(posi).getImageUrl();
String MLAAREA=MlaDats.get(posi).getArea();
intent.putExtra("MLA_ID", MLAID);
intent.put
Extra("MLA_NAME", MLANAME);
intent.putExtra("MLA_EMAIL", MLAEMAIL);
intent.putExtra("MLA_IMAGE", MLAIMAGE);
intent.putExtra("MLA_AREA", MLAAREA);
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("Mukesh", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("MLAID", MLAID);
editor.putString("MLANAME",MLANAME);
editor.commit();
startActivity(intent);
}
});
DataModel Class :
package com.wdm.mukku.wdm;
public class MlaData {
private String name;
private String imageUrl;
private String area;
private String email;
private String id;
public String getImageUrl() {
return imageUrl;
}
public void setImageUrl(String imageUrl) {
this.imageUrl = imageUrl;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getImage() {
return imageUrl;
}
public void setImage(String image) {
this.imageUrl = image;
}
public String getArea() {
return area;
}
public void setArea(String area) {
this.area = area;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public MlaData(String name,String image,String area,String id,String email) {
this.name=name;
this.imageUrl=image;
this.area=area;
this.id=id;
this.email=email;
}
public MlaData() {
}
}
Upvotes: 1
Views: 1669
Reputation: 371
You can get filtered listview's position by
((ListView) parent).getAdapter().getItem(position)
Example private ArrayList MlaDats = new ArrayList();
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(final AdapterView<?> parent, final View view, final int position, final long id) {
MlaData mModel = ((ListView) parent).getAdapter().getItem(position);
String id = mModel.getId();
Log.d(TAG,"id = "+id);
}
});
Upvotes: 1
Reputation: 21736
1. Update your adapter's method getItemId()
as below:
@Override
public long getItemId(int position) {
return position;
}
2. Update ListView onItemClick()
method as below:
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
MlaData item = MlaDats.get(position);
String MLAID = item.getId();
String MLANAME = item.getName();
String MLAEMAIL = item.getEmail();
String MLAIMAGE = item.getImageUrl();
String MLAAREA = item.getArea();
Intent intent = new Intent(Rajasthan_Mla.this, MainActivity.class);
intent.putExtra("MLA_ID", MLAID);
intent.putExtra("MLA_NAME", MLANAME);
intent.putExtra("MLA_EMAIL", MLAEMAIL);
intent.putExtra("MLA_IMAGE", MLAIMAGE);
intent.putExtra("MLA_AREA", MLAAREA);
SharedPreferences sharedPreferences = getApplicationContext().getSharedPreferences("Mukesh", 0);
SharedPreferences.Editor editor = sharedPreferences.edit();
editor.putString("MLAID", MLAID);
editor.putString("MLANAME",MLANAME);
editor.commit();
startActivity(intent);
}
});
Upvotes: 0
Reputation: 1783
First change this
public mAdapter(Context ctx,ArrayList<MlaData> dats){
this.c=ctx;
this.dats=dats;
// will create a new array instead of referencing to the same object
this.filterList = new ArrayList<MlaData>(dats);
}
Next don't modify dats
anymore and only use the filtered list, so you will keep the original list and use that when you filter on something else.
So use this in your filter
// temp array to store filtered data
ArrayList<MlaData> filters = new ArrayList<MlaData>();
// use original list to loop through and check for matches
for (int i = 0; i < dats.size(); i++) {
if (dats.get(i).getName().toUpperCase().contains(constraint)) {
MlaData MlaDat = new MlaData(dats.get(i).getName(), dats.get(i).getImageUrl(), dats.get(i).getArea(), dats.get(i).getId(), dats.get(i).getEmail());
filters.add(MlaDat);
}
}
results.count = filters.size();
results.values = filters;
}
else {
results.count = dats.size();
results.values = dats;
}
return results;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults results) {
// assign the filtered data to filterList
filterList = (ArrayList<MlaData>)results.values;
notifyDataSetChanged();
}
And finally change your methods to use the filtered list
@Override
public int getCount() {
return filterList.size();
}
@Override
public Object getItem(int position) {
return filterList.get(position);
}
@Override
public long getItemId(int position) {
return ((MlaData)filterList.get(position)).getId();
}
When you clear the filter you should reset the filterList
to the original data again
filterList = new ArrayList<MlaData>(dats);
Upvotes: 0