Reputation: 21
I want to search a list view in my android application so i used android search view widget for this. I implemented search successfully but the problem is arriving after search. when i search it gives me filtered results but when i click on the filtered items it gives me wrong position. Please help me with this.
MainActivity
public class MainActivity extends AppCompatActivity implements
SlidingPaneLayout.PanelSlideListener,
android.widget.SearchView.OnQueryTextListener
{
public static ListView mcontact;
RelativeLayout right, left;
public static ArrayList<Contacts> mList;
MyContactsAdapter mMyContactsAdapter;
SlidingPaneLayout sp;
Context context=this;
android.widget.SearchView sv;
public static String number;
public static String email;
@Override
protected void onCreate(Bundle savedInstanceState)
{
context = this;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
right = (RelativeLayout) findViewById(R.id.rightSide);
left = (RelativeLayout) findViewById(R.id.leftSide);
mcontact = (ListView) findViewById(R.id.contact);
sv= (android.widget.SearchView) findViewById(R.id.searchView1);
sp = (SlidingPaneLayout) findViewById(R.id.Sliding);
assert sp != null;
sp.setSliderFadeColor(Color.TRANSPARENT);
sp.openPane();
mList = new ArrayList<Contacts>();
readContacts();
mcontact.setTextFilterEnabled(true);
mcontact.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
number=mList.get(position).getNumber();
email=mList.get(position).getEmail();
view.setSelected(true);
}
});
setupSearchView();
}
private void setupSearchView()
{
sv.setIconifiedByDefault(false);
sv.setOnQueryTextListener(this);
sv.setSubmitButtonEnabled(true);
sv.setQueryHint("Search Here");
}
public void readContacts() {
ContentResolver cr = getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
null, null, null);
String phone = null;
String emailContact = null;
String emailType = null;
String image_uri = "";
Bitmap bitmap = null;
if (cur.getCount() > 0) {
while (cur.moveToNext()) {
String id = cur.getString(cur
.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur
.getString(cur
.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
image_uri = cur
.getString(cur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));
if (Integer
.parseInt(cur.getString(cur
.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
System.out.println("name : " + name + ", ID : " + id);
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID
+ " = ?", new String[]{id}, null);
while (pCur.moveToNext())
{
phone = pCur
.getString(pCur
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
System.out.println("phone" + phone);
}
pCur.close();
Cursor emailCur = cr.query
(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID
+ " = ?", new String[]{id}, null);
while (emailCur.moveToNext())
{
emailContact = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
if(TextUtils.isEmpty(emailContact)||emailContact.equalsIgnoreCase(null)||emailContact.equalsIgnoreCase("")){
emailContact="";
Log.e("isEmpty","isEmpty " + emailContact);
}else{
Log.e("gfdszfg","Email " + emailContact);
}
/* emailType = emailCur
.getString(emailCur
.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));*/
Log.e("gfdszfg","Email " + emailContact);
}
emailCur.close();
}
if (image_uri != null) {
System.out.println(Uri.parse(image_uri));
try {
bitmap = MediaStore.Images.Media
.getBitmap(this.getContentResolver(),
Uri.parse(image_uri));
System.out.println(bitmap);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
mList.add(new Contacts(name, phone, image_uri,emailContact));
emailContact="";
}
cur.close();
mMyContactsAdapter = new MyContactsAdapter(MainActivity.this, mList);
mcontact.setAdapter(mMyContactsAdapter);
}
}
@Override
public void onPanelSlide(View panel, float slideOffset)
{
}
@Override
public void onPanelOpened(View panel) {
left.setVisibility(View.VISIBLE);
}
@Override
public void onPanelClosed(View panel)
{
left.setVisibility(View.VISIBLE);
}
@Override
public boolean onQueryTextSubmit(String query)
{
return false;
}
@Override
public boolean onQueryTextChange(String newText)
{
if (TextUtils.isEmpty(newText)) {
mcontact.clearTextFilter();
mMyContactsAdapter.getFilter().filter("");
} else {
mcontact.setFilterText(newText);
}
return true;
}
}
My adapter class
public class MyContactsAdapter extends BaseAdapter implements Filterable
{
private Context mContext;
ArrayList<Contacts> coverList;
public ArrayList<Contacts> orig;
private ColorGenerator mColorGenerator = ColorGenerator.MATERIAL;
private TextDrawable.IBuilder mDrawableBuilder;
public MyContactsAdapter(Context c, ArrayList<Contacts> coverList)
{
super();
mContext = c;
this.coverList = coverList;
}
@Override
public int getCount()
{
return coverList.size();
}
@Override
public Contacts getItem(int position) {
return coverList.get(position);
}
@Override
public long getItemId(int position) {
return 0;
}
@Override
public View getView(final int position, View convertView,
final ViewGroup parent)
{
View grid = null;
convertView = null;
LayoutInflater inflater = (LayoutInflater) mContext
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
if (convertView == null)
{
grid = new View(mContext);
grid = inflater.inflate(R.layout.list_item, parent, false);
TextView nameTxt = (TextView) grid.findViewById(R.id.name_entry);
final TextView numTxt = (TextView)
grid.findViewById(R.id.number_entry);
final TextView emailTxt = (TextView) grid.findViewById(R.id.email);
final ImageView adImage = (ImageView)
grid.findViewById(R.id.profile_pic);
grid.setTag(adImage);
nameTxt.setText(coverList.get(position).getName());
numTxt.setText(coverList.get(position).getNumber());
emailTxt.setText(coverList.get(position).getEmail());
Log.e("NUMBER","dxdd"+coverList.get(position).getEmail());
if (TextUtils.isEmpty(coverList.get(position).getImage()) || coverList.get(position).getImage().equalsIgnoreCase(null))
{
mDrawableBuilder = TextDrawable.builder()
.beginConfig()
.withBorder(4)
.endConfig()
.round();
TextDrawable drawable =
mDrawableBuilder.build(String.valueOf(coverList.get(position)
.getName().
charAt(0)), mColorGenerator.getColor(coverList.get(position).getName()));
adImage.setImageDrawable(drawable);
} else
{
// System.out.println(Uri.parse(coverList.get(position).getImage()));
Picasso.with(mContext)
.load(coverList.get(position).getImage()).
transform(new CircleTransform())
.resize(60, 60)
.into(adImage);
}
adImage.setOnLongClickListener(new View.OnLongClickListener() {
@Override
public boolean onLongClick(View v)
{
String number=coverList.get(position).getNumber();
String email=coverList.get(position).getEmail();
ClipData.Item item = new ClipData.Item((CharSequence)number);
ClipData.Item mail = new ClipData.Item((CharSequence)email);
String[] mimeTypes = {ClipDescription.MIMETYPE_TEXT_PLAIN};
ClipData dragData = new ClipData("",mimeTypes,item);
dragData.addItem(mail);
Log.e("NUMBER",number+ "dragdata"+dragData.getItemAt(1));
View.DragShadowBuilder shadowBuilder = new
View.DragShadowBuilder(adImage);
adImage.startDrag(dragData, shadowBuilder, adImage, 1);
adImage.setVisibility(View.INVISIBLE);
return false;
}
});
adImage.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View v)
{
((ListView) parent).performItemClick(v, position, 0); // Let
the event be handled in onItemClick()
}
});
}
return grid;
}
@Override
public Filter getFilter()
{
return new Filter()
{
@Override
protected FilterResults performFiltering(CharSequence constraint)
{
final FilterResults oReturn= new FilterResults();
final ArrayList<Contacts> result= new ArrayList<Contacts>();
if(orig== null)
orig = coverList ;
if (constraint!=null)
{
if (orig!=null && orig.size()>0)
{
for (final Contacts c:orig)
{
if
(c.getName().toLowerCase().contains(constraint.toString()))
result.add(c);
}
}
oReturn.values = result;
}
return oReturn;
}
@Override
protected void publishResults(CharSequence constraint, FilterResults
results)
{
coverList = (ArrayList<Contacts>) results.values;
notifyDataSetChanged();
}
};
}
public class CircleTransform implements Transformation {
@Override
public Bitmap transform(Bitmap source) {
int size = Math.min(source.getWidth(), source.getHeight());
int x = (source.getWidth() - size) / 2;
int y = (source.getHeight() - size) / 2;
Bitmap squaredBitmap = Bitmap.createBitmap(source, x, y, size,
size);
if (squaredBitmap != source) {
source.recycle();
}
Bitmap bitmap = Bitmap.createBitmap(size, size, source.getConfig());
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();
BitmapShader shader = new BitmapShader(squaredBitmap,
BitmapShader.TileMode.CLAMP, BitmapShader.TileMode.CLAMP);
paint.setShader(shader);
paint.setAntiAlias(true);
float r = size / 2f;
canvas.drawCircle(r, r, r, paint);
squaredBitmap.recycle();
return bitmap;
}
@Override
public String key() {
return "circle";
}
}
}
Upvotes: 1
Views: 1089
Reputation: 3121
The problem is that the search is filtering the array inside the adapter coverList
. So, in the adapter the position of the item is OK.
But then, you call the action outside of the adapter (in class) mList
. In that point you are looking in the original array, which has no filter. So the position is wrong.
You need to recover the Contact from the filtered array in the Adapter. So in your MainActivity:
mcontact.setOnItemClickListener(new AdapterView.OnItemClickListener()
{
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id)
{
number = mMyContactsAdapter.getItem(position).getNumber();
email = mMyContactsAdapter.getItem(position).getEmail();
view.setSelected(true);
}
});
Upvotes: 1
Reputation: 41
You need to update the adapter in mcontact button click
mMyContactsAdapter.getItem(position);
Contacts mList = getSearchResults(sv.getQuery().toString()).get(position);
number = mList.get(position).getNumber();
email = mList.get(position).getEmail();
Upvotes: 0