Java ViewAdapter正在复制listview中的选定项

Java ViewAdapter正在复制listview中的选定项,java,android,listview,android-arrayadapter,Java,Android,Listview,Android Arrayadapter,因此,我一直在寻找这个解决方案,得到了一些线索,但始终无法解决它。我读到它与景观被循环利用有关,但不知道如何阻止它。基本上我有一个listview和数组适配器,在listview中有复选框,当我选中一个项目并向下滚动时,会再次选择一个随机项目。文本是不同的,但似乎项目是在某种模式检查 谢谢你的帮助 package com.example.myapplication; private static final String TAG = viewContacts.class.getSimpleNa

因此,我一直在寻找这个解决方案,得到了一些线索,但始终无法解决它。我读到它与景观被循环利用有关,但不知道如何阻止它。基本上我有一个listview和数组适配器,在listview中有复选框,当我选中一个项目并向下滚动时,会再次选择一个随机项目。文本是不同的,但似乎项目是在某种模式检查

谢谢你的帮助

package com.example.myapplication;

private static final String TAG = viewContacts.class.getSimpleName();
ListView listView_Android_Contacts;
ListView viewContacts;
Cursor c;
CheckBox cb;
ArrayList<String> contacts;
ArrayList<String> listMessages;
LinearLayout linearMain;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_view_contacts);
    final ListView viewContacts = findViewById(R.id.contactsView);
    Dexter.withActivity(this)
            .withPermission(Manifest.permission.READ_CONTACTS)
            .withListener(new PermissionListener() {
                @Override
                public void onPermissionGranted(PermissionGrantedResponse response) {
                    get();
                }

                @Override
                public void onPermissionDenied(PermissionDeniedResponse response) {
                    // check for permanent denial of permission
                    if (response.isPermanentlyDenied()) {
                        // navigate user to app settings
                    }
                }

                @Override
                public void onPermissionRationaleShouldBeShown(PermissionRequest permission, PermissionToken token) {
                    token.continuePermissionRequest();
                }
            }).check();
    ArrayAdapter<String> adapter = new ArrayAdapter<String>(
            this, android.R.layout.simple_list_item_multiple_choice, contacts
    );
    viewContacts.setAdapter(adapter);
    viewContacts.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            CheckedTextView checkedTextView = ((CheckedTextView)view);
            checkedTextView.setChecked(!checkedTextView.isChecked());
        }
    });
}

public void get(){

    c = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, ContactsContract.Contacts.DISPLAY_NAME );
    contacts = new ArrayList<>();
    while(c.moveToNext()){
        String contactName = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
        String phoneNumber = c.getString(c.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        contacts.add( contactName + "\n" + phoneNumber);

        Log.d(TAG, "show contacts:");
    }
    c.close();
}
package com.example.myapplication;
私有静态最终字符串标记=viewContacts.class.getSimpleName();
ListView ListView_Android_联系人;
ListView查看联系人;
光标c;
复选框cb;
ArrayList联系人;
ArrayList列表消息;
线性布局线性化;
@凌驾
创建时受保护的void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
setContentView(R.layout.activity\u view\u contacts);
final ListView viewContacts=findViewById(R.id.contactsView);
Dexter.withActivity(本)
.withPermission(Manifest.permission.READ_联系人)
.withListener(新权限Listener(){
@凌驾
已授予许可的公共无效(许可授予响应){
get();
}
@凌驾
公共无效onPermissionDenied(PermissionDeniedResponse响应){
//检查是否永久拒绝许可
if(response.isPermanentlyDenied()){
//将用户导航到应用程序设置
}
}
@凌驾
public void on PermissionRational应显示(PermissionRequest权限、PermissionToken令牌){
token.continuePermissionRequest();
}
}).检查();
ArrayAdapter适配器=新的ArrayAdapter(
这个,android.R.layout.simple\u list\u item\u多选,联系人
);
viewContacts.setAdapter(适配器);
viewContacts.setOnItemClickListener(新的AdapterView.OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父对象、视图、整型位置、长id){
CheckedTextView CheckedTextView=((CheckedTextView)视图);
checkedTextView.setChecked(!checkedTextView.isChecked());
}
});
}
公开作废获取(){
c=getContentResolver().query(ContactsContract.CommonDataTypes.Phone.CONTENT\u URI,null,null,null,ContactsContract.Contacts.DISPLAY\u NAME);
联系人=新的ArrayList();
while(c.moveToNext()){
String contactName=c.getString(c.getColumnIndex(ContactsContract.CommonDataTypes.Phone.DISPLAY_NAME));
String phoneNumber=c.getString(c.getColumnIndex(ContactsContract.CommonDataTypes.Phone.NUMBER));
联系人。添加(联系人姓名+“\n”+电话号码);
Log.d(标签“显示联系人:”);
}
c、 close();
}

要解决此问题,您必须创建自己的自定义适配器。这是我唯一的选择吗?我能做些什么来修改现有代码以使其正常工作吗?谢谢-Jean。我认为bcoz您不必在
Bindview
方法中做一些修改。我如何通过修改当前代码来创建自己的自定义适配器?请参考此示例“自定义适配器”,但它不会解决问题。在这里实现适配器和代码。然后我可以帮你。