java - 使用 OnItemCLick 时 Android ArrayList 搜索过滤器更改索引

标签 java android arraylist android-arrayadapter custom-arrayadapter

这是一个奇怪的问题,几乎看起来像是一个错误。 所以我使用一个 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);

    }


}

过滤后

After the filtering

点击后

After clicking

最佳答案

注意 - 未在项目中进行测试。 而不是

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/

相关文章:

java - ArrayList Scanner 输入帮助 Java

java - 将CSV文件中的数据读取到ArrayList中并显示在XY图表中

java - JAXB 和类实例化

Java:检查循环中的当前项目是否是正在循环的堆栈中的最后一个项目

android - Gradle 构建无法在 Android Studio 中查找 Google Play 服务 - 我的 SDK 是否正确?

android - 如何使用 SingleLiveEvent 类将多个命令从 MVVM 发送到 View

java - toCharArray 何时在运行时被调用

java - 如何在 Java 中合并图像而不将它们加载到 RAM 中

javascript - 如何将链接重定向到 Google Play 市场?

java - 将 ArrayList<Person> 传递给新 Activity