这是一个奇怪的问题,几乎看起来像是一个错误。 所以我使用一个 arraylist 和一个扩展 ArrayAdapter 的自定义 ListView 。
arraylist 填充自定义 ListView ,我在操作栏中实现了一个搜索框 过滤自定义适配器,顺便说一句,它工作得很好。
问题是我正在尝试使用过滤后的数据,因此我在 ListView 上使用 OnItemCLickListener 来使用索引并获取与过滤结果相对应的数据。
但是这里发生的是数据被过滤,数组列表本身也是如此。
说当我打开 Activity 时,它显示我的联系人我的所有联系人 所以我使用搜索栏搜索一个给我这个名字的名字
保罗说,
现在 paul 在搜索栏过滤后位于 0 索引,现在当我点击 paul 时,我期望 paul 的数据,但我得到了 arraylist 原始 0 索引数据的数据
说它是无的
所以在 OniItelClickListiner 中我得到了 anil 的数据而不是 paul 的数据
这是代码
public class sendSms extends AppCompatActivity implements LoaderManager.LoaderCallbacks<Cursor> {
ListView listView;
ArrayList<contact> arrayList;
CustomArrayAdapterForContact customArrayAdapterForContact;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send_sms);
listView = (ListView) findViewById(R.id.showContactsListView);
arrayList = new ArrayList<contact>();
customArrayAdapterForContact = new CustomArrayAdapterForContact(this, arrayList);
listView.setAdapter(customArrayAdapterForContact);
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
Intent intent = new Intent(getApplicationContext(), typeMessage.class);
intent.putExtra("id", arrayList.get(position).contact_id);
intent.putExtra("name", arrayList.get(position).display_name);
intent.putExtra("number", arrayList.get(position).display_number);
startActivity(intent);
}
});
getSupportLoaderManager().initLoader(5, null, this);
}
class CustomArrayAdapterForContact extends ArrayAdapter<contact> {
ArrayList<contact> contact;
public CustomArrayAdapterForContact(@NonNull Context context, ArrayList<contact> contact) {
super(context, 0, contact);
this.contact = contact;
}
@NonNull
@Override
public View getView(int position, @Nullable View convertView, @NonNull ViewGroup parent) {
contact innserContact = getItem(position);
if (convertView == null){
convertView = LayoutInflater.from(getContext()).inflate(R.layout.row_layout, parent, false);
}
TextView username = (TextView) convertView.findViewById(R.id.subject);
TextView userNumber = (TextView) convertView.findViewById(R.id.address);
try {
if (innserContact.display_name.length() > 30) {
username.setText(innserContact.display_name.substring(0, 30));
}else{
username.setText(innserContact.display_name);
}
userNumber.setText(innserContact.display_number);
}catch (Exception e){
e.printStackTrace();
}
return convertView;
}
}
@NonNull
@Override
public Loader<Cursor> onCreateLoader(int i, @Nullable Bundle bundle) {
String[] projection = {
ContactsContract.Contacts._ID,
ContactsContract.Contacts.DISPLAY_NAME,
ContactsContract.Contacts.HAS_PHONE_NUMBER
};
return new CursorLoader(
this,
ContactsContract.Contacts.CONTENT_URI,
projection,
null,
null,
ContactsContract.Contacts.DISPLAY_NAME
);
}
@Override
public void onLoadFinished(@NonNull Loader<Cursor> loader, Cursor cursor) {
while(cursor.moveToNext()){
String con_id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
String con_name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER)) > 0){
ContentResolver cr = getContentResolver();
Cursor pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[]{con_id}, null);
while (pCur.moveToNext()) {
String phoneNo = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
contact con = new contact(con_id, con_name, phoneNo);
arrayList.add(con);
break;
}
pCur.close();
}
}
customArrayAdapterForContact.notifyDataSetChanged();
}
@Override
public void onLoaderReset(@NonNull Loader<Cursor> loader) {
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.search_box, menu);
MenuItem item = menu.findItem(R.id.app_bar_search);
SearchView searchView = (SearchView)item.getActionView();
searchView.setOnQueryTextListener(new SearchView.OnQueryTextListener() {
@Override
public boolean onQueryTextSubmit(String query) {
return false;
}
@Override
public boolean onQueryTextChange(String newText) {
customArrayAdapterForContact.getFilter().filter(newText);
return true;
}
});
return super.onCreateOptionsMenu(menu);
}
}
过滤后
点击后
最佳答案
注意 - 未在项目中进行测试。 而不是
intent.putExtra("id", arrayList.get(position).contact_id);
intent.putExtra("name", arrayList.get(position).display_name);
intent.putExtra("number", arrayList.get(position).display_number);
尝试使用
intent.putExtra("id", parent.getItemAtPosition(position).contact_id);
intent.putExtra("name", parent.getItemAtPosition(position).display_name);
intent.putExtra("number", parent.getItemAtPosition(position).display_number);
还要记住将获取的项目转换为正确的类型。
关于java - 使用 OnItemCLick 时 Android ArrayList 搜索过滤器更改索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54834261/