Prashant Jaiswal
Prashant Jaiswal

Reputation: 21

Search using android search view widget not showing correct position after searching

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

Answers (2)

adalpari
adalpari

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

Bwes
Bwes

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

Related Questions