gpt4 book ai didi

android - 搜索后使用 android 搜索 View 小部件搜索未显示正确位置

转载 作者:行者123 更新时间:2023-11-30 00:45:19 25 4
gpt4 key购买 nike

我想在我的 android 应用程序中搜索 ListView ,所以我为此使用了 android 搜索 View 小部件。我成功地实现了搜索,但问题是在搜索后出现。当我搜索时,它会给我过滤后的结果,但是当我单击过滤后的项目时,它会给我错误的位置。请帮我解决这个问题。

主 Activity

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

最佳答案

问题是搜索正在过滤适配器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);
}
});

关于android - 搜索后使用 android 搜索 View 小部件搜索未显示正确位置,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41891578/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com