Просмотр списка с помощью CursorAdapter

Im разрабатывает приложение, отображающее телефонные контакты с 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 "Просмотр списка с помощью CursorAdapter"

Я заметил несколько моментов:

  1. CursorAdapter перемещает курсор для вас, выньте свой вызов в cursor.moveToNext() .
  2. Адаптер getView() вызывает newView() и bindView() самостоятельно; Вы не должны сами называть эти методы.
  3. Вы должны следить за лекциями разработчика Android в Google IO, чтобы узнать советы и подсказки об ускорении вашего адаптера. Советы:
    • Использование ViewHolder, а не вызов findViewById() несколько раз.
    • Сохранение индексов вашего курсора, а не вызов функции getColumnIndex() .
    • Выбрав LayoutInflater один раз и сохраняя локальную ссылку.

Кроме того, я предлагаю вам перейти от использования CursorManager к использованию CursorLoader. Это описано в руководстве по API Android под Loaders. Конкретный пример, который вы можете найти полезным, приведен здесь .

Адаптер курсора «связывает» курсор с ListView. Курсор представляет собой представление данных данных, а ListView представляет собой представление пользовательского интерфейса для одних и тех же данных. Вам не нужно ничего программировать, чтобы заставить ListView синхронизировать с курсором, все это обрабатывается автоматически.

Вам нужно указать ListView, какие столбцы в Cursor он должен отображать, см. Документацию для класса SimpleCursorAdapter . Обычно я использую этот класс, если мне не нужно изменять данные, когда я перемещаю его из курсора в ListView.