带有光标适配器滚动问题的android列表视图

Posted

技术标签:

【中文标题】带有光标适配器滚动问题的android列表视图【英文标题】:android list view with cursor adapter scrolling issue 【发布时间】:2012-05-25 01:52:47 【问题描述】:

在我的应用程序中,我将联系人加载到列表视图中。我有带有图像、文本和复选框的列表视图,并由光标适配器实现。我的问题是当我向上/向下滚动列表视图时,它的位置发生了变化。也就是说,如果选择(勾选复选框)位置 1、3、4、2 并向下和向上滚动,勾选的位置会随机更改。我花了更多时间来找出解决方案,但我无法得到它。请帮帮我。

我的适配器代码:

    public class ContactsListAdapter extends CursorAdapter 

    ContentResolver cr;
    private final LayoutInflater mInflater;
    private Context mContext;

    @SuppressWarnings("unchecked")
    public ContactsListAdapter(Context context, Cursor c,ArrayList<ContactPhoneInfo> selected) 
        super(context, c, true);
        this.checkedContacts = (ArrayList<ContactPhoneInfo>) selected.clone();
        mInflater = LayoutInflater.from(context);
        this.mContext = context;
    

    public void bindView(View view,Context context_bind, Cursor cursor)
       
        final LinearLayout linear = (LinearLayout) view.findViewById(R.id.contacts_linearLayout1);
        final TextView contactEntryText = (TextView) view.findViewById(R.id.contacts_txtViewContactName);
        final CheckBox chkContact = (CheckBox) view.findViewById(R.id.contacts_chkContact);
        final TextView textCaption = (TextView) view.findViewById(R.id.contacts_layoutCaption);
        final ImageView photoView = (ImageView)view.findViewById(R.id.contacts_imgViewcontact);

        ContentResolver cr = context_bind.getContentResolver();
            .......

        int id = Integer.parseInt(cursor.getString(0));
        final String name = cursor.getString(1);

        contactEntryText.setText(name);
            .......
        view.setClickable(true);
        view.setFocusable(true);

        view.setOnClickListener(new OnClickListener() 
            public void onClick(View v) 
            
                chkContact.setChecked(!chkContact.isChecked());
            
        );

        chkContact.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
                .buttonView.........
            
        );
    

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) 
        final View view = mInflater.inflate(R.layout.contacts_listitem, parent,
                false);
        return view;
    

调用类编码:

        contactsListAdapter = new ContactsListAdapter(this,app.loadContactCursor(""),checkedContacts);
    setListAdapter(contactsListAdapter);

【问题讨论】:

你为什么使用CursorAdapter而不是ArrayAdapter 因为我正在获取联系人并直接在列表视图中加载光标。我没有使用数组列表。有没有办法通过arrayadapter加载光标? 是的,您只需访问 ArrayAdapter 的 getView 方法中的数据。视图会被回收以提高性能,因此请务必牢记这一点。 谢谢你能举个例子吗? sudarmuthu.com/blog/… 【参考方案1】:

我已经通过在调用 setChecked 之前调用 setOnCheckedChangeListener 方法解决了我的问题

    chkContact.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() 
        public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) 
            .buttonView.........
        
    );

之后

chkContact.setChecked(!chkContact.isChecked());

我参考以下堆栈溢出问题:

android listview with checkbox problem

【讨论】:

以上是关于带有光标适配器滚动问题的android列表视图的主要内容,如果未能解决你的问题,请参考以下文章

如何从 postgresql 视图表中获取要显示的对象列表

无法将查询另存为视图表

如何从 Sqlite ( android ) 中的 datetime 字段获取日期

错误支持 v4 view.NestedScrollingChild2 在回收视图集适配器

文本文件字符串拆分然后将每个元素输出到视图表中

推动视图表的自定义 sql