2017-01-27 15 views
0

내 안드로이드 응용 프로그램에서 목록보기를 검색하고 싶습니다. 그래서이 android 검색보기 위젯을 사용했습니다. 검색을 성공적으로 구현했으나 검색 후 문제가 발생했습니다. 내가 검색 할 때 검색 결과가 필터링되지만 필터링 된 항목을 클릭하면 잘못된 위치가 표시됩니다. 도와주세요.android search widget을 사용하여 검색 검색 후 올바른 위치가 표시되지 않습니다.

당신은 mcontact 버튼 클릭으로 어댑터를 업데이트해야 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; 
} 

}

내 어댑터 클래스

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

귀하의 코드는 어디에 있습니까? 우리는 그것없이 당신을 도울 수 없습니다. – adalPaRi

+0

여기에 코드 @adalPaRi –

답변

0

문제는 검색 어댑터 coverList내부 배열 필터링된다는 점이다. 따라서 어댑터에서 항목의 위치는 정상입니다.

그런 다음 어댑터 (클래스) mList외부을 호출합니다. 그 시점에서 필터가없는 원래 배열을보고 있습니다. 그래서 입장이 잘못되었습니다.

어댑터의 필터링 된 배열에서 연락처를 복구해야합니다. 따라서 귀하의 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

감사합니다. 나는 일주일이 넘도록 노력해 왔습니다 ... @ adalPaRi –

0

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