2017-01-27 3 views
0

Ich möchte eine Listenansicht in meiner Android-Anwendung zu suchen, so dass ich Android Widget Widget für diese Suche verwendet. Ich habe die Suche erfolgreich durchgeführt, aber das Problem tritt nach der Suche ein. Wenn ich es suche gibt mir gefilterte Ergebnisse, aber wenn ich auf die gefilterten Elemente klicke, gibt es mir falsche Position. Bitte helfen Sie mir dabei.Suche mit Android-Suche Ansicht Widget zeigt nicht die richtige Position nach der Suche

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; 
} 

}

Mein Adapter Klasse

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"; 
    } 
} 

}

+0

wo ist dein Code? wir können dir nicht ohne es helfen. – adalPaRi

+0

hier ist der code @adalPaRi –

Antwort

0

Das Problem ist, dass die Suche das Array Filterung innen der Adapter coverList. Also, in dem Adapter ist die Position des Artikels in Ordnung.

Aber dann rufen Sie die Aktion außerhalb des Adapters (in der Klasse) mList. An dieser Stelle suchen Sie im ursprünglichen Array, das keinen Filter hat. Also ist die Position falsch.

Sie müssen den Kontakt aus dem gefilterten Array im Adapter wiederherstellen. Also in Ihrem 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); 
    } 
}); 
+0

danke mann du hast meinen tag gerettet. Ich habe seit Wochen versucht ... @ AdalPaRi –

0

benötigen Sie den Adapter in mcontact Schaltfläche klicken aktualisieren

mMyContactsAdapter.getItem(position); 
Contacts mList = getSearchResults(sv.getQuery().toString()).get(position); 
number = mList.get(position).getNumber(); 
email = mList.get(position).getEmail(); 
Verwandte Themen