ListView与CursorAdapter

我开发一个应用程序显示电话与CursorAdapter联系。 当我运行它时,我面临着一个列表视图,它只是重复一个联系人(“david”是我的联系人之一,只是在列表视图中重复)

大卫017224860

大卫017224860

大卫017224860

大卫017224860

大卫017224860

大卫017224860。

我的活动看起来像

public class Contacts extends Activity { @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.contacts); Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,null, null); startManagingCursor(cursor); ContactCursorAdapterCT adapter= new ContactCursorAdapterCT(Contacts.this, cursor); ListView contactLV = (ListView) findViewById(R.id.listviewblcontactsDB); contactLV.setAdapter(adapter); 

我的cursorAdapter看起来像:

 public class ContactCursorAdapterCT extends CursorAdapter { public ContactCursorAdapterCT(Context context, Cursor c) { super(context, c); // TODO Auto-generated constructor stub } @Override public void bindView(View view, Context context, Cursor cursor) { while (cursor.moveToNext()) { TextView name = (TextView)view.findViewById(R.id.blacklistDB1); name.setText(cursor.getString(cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME))); TextView phone = (TextView)view.findViewById(R.id.blacklistDB2); phone.setText(cursor.getString(cursor.getColumnIndex (ContactsContract.CommonDataKinds.Phone.NUMBER))); } } @Override public View newView(Context context, Cursor cursor, ViewGroup parent) { // TODO Auto-generated method stub LayoutInflater inflater = LayoutInflater.from(context); View v = inflater.inflate(R.layout.lv, parent, false); bindView(v, context, cursor); return v; } 

Solutions Collecting From Web of "ListView与CursorAdapter"

我注意到了几点:

  1. CursorAdapter为你移动光标,取出你的调用cursor.moveToNext()
  2. 适配器的getView()调用newView()bindView() 。 你不应该自己调用这些方法。
  3. 您应该在Google IO上观看Android开发人员的讲座,了解加速适配器的提示和技巧。 提示如:
    • 使用ViewHolder,而不是重复调用findViewById()
    • 保存游标的索引,而不是重复调用getColumnIndex()
    • 一次获取LayoutInflater并保留本地引用。

另外,我build议你从使用CursorManager切换到使用CursorLoader。 这在Android API指南中的Loaders下面有logging。 您可能会发现一个具体的例子, 在这里 。

一个光标适配器“连接”一个光标到一个ListView。 Cursor是数据的数据视图,ListView是相同数据的UI视图。 你不需要编程任何东西来使ListView与Cursor保持同步,这一切都是自动处理的。

您确实需要告诉ListView它应该显示的Cursor中的哪些列,请参阅SimpleCursorAdapter类的文档。 我通常使用该类,除非我必须修改数据,因为我将它从光标移动到ListView。