У меня CursorAdapter
который построен из базы данных Cursor
и если View
в первом пункте не заполняются, она заполнит первый элемент View
сек с тем, что данные отображаются в что View
в первом последующем элементе списка, где установлен View
. Кроме того, я обнаружил, что onBindView
трижды запускается для каждого элемента списка, что кажется странным. и он делает это только для первого элемента списка, а не для всех элементов с нулевым значением View
. Вот как это выглядит:Android CursorAdapter рисунок вещи в неправильном списке пункт
Обратите внимание, что адрес «Юлиана» был скопирован в «Алисе». всякий раз, когда я устанавливаю точку останова в методе onBindView, я вижу, что когда customerName является «Alice Martin», if(billingAddressCursor!=null && billingAddressCursor.getCount()>0)
всегда оценивает значение false для всех трех вызовов onBindView
, поэтому я знаю, что он никогда не переходит в условное обозначение.
Почему он рисует неправильные значения в первой позиции и как я могу остановить его? код:
private class CustomerAdapter extends CursorAdapter {
/*** DEBUG CODE, TO BE REMOVED ***/
int aliceBindCount = 0;
int blakeBindCount = 0;
int cscBindCount = 0;
int julianBindCount = 0;
/*** ^^^^^^^^^^^^^^^^^^^^^^^^^ ***/
public CustomerAdapter(Context context, Cursor cursor) {
super(context, cursor);
}
public void bindView(View convertView, Context context, Cursor cursor) {
if(convertView!=null) {
String customerName = cursor.getString(cursor.getColumnIndex(CustomerSchema.NAME));
((TextView)convertView.findViewById(R.id.cli_customer_name)).setText(customerName);
/*** DEBUG CODE, TO BE REMOVED ***/
if(customerName.equals("Alice Martin")) {
aliceBindCount += 1;
} else if(customerName.equals("Blake Slappey")) {
blakeBindCount += 1;
} else if(customerName.equals("Conceptual Systems")) {
cscBindCount += 1;
} else if(customerName.equals("Julian")) {
julianBindCount += 1;
}
/*** ^^^^^^^^^^^^^^^^^^^^^^^^^ ***/
}
final Long billingAddressID = cursor.getLong(cursor.getColumnIndex(CustomerSchema.BILLING_ADDRESS_ID));
Cursor billingAddressCursor = DbDesc.getInstance().getDatabase(getActivity()).query(
LocationSchema.TABLE_NAME,
null,
LocationSchema._ID+"=?",
new String[]{ String.valueOf(billingAddressID) },
null,
null,
null
);
if(billingAddressCursor!=null && billingAddressCursor.getCount()>0) {
billingAddressCursor.moveToFirst();
String street = billingAddressCursor.getString(billingAddressCursor.getColumnIndex(LocationSchema.STREET));
String city = billingAddressCursor.getString(billingAddressCursor.getColumnIndex(LocationSchema.CITY));
String state = billingAddressCursor.getString(billingAddressCursor.getColumnIndex(LocationSchema.STATE));
String zip = billingAddressCursor.getString(billingAddressCursor.getColumnIndex(LocationSchema.ZIP));
if(zip==null || zip.equals("")) {
zip = "[NO ZIP]";
}
if(street==null || street.equals("")) {
street = "[NO STREET]";
}
if(city==null || city.equals("")) {
city = "[NO CITY]";
}
if(state==null || state.equals("")) {
state = "[NO STATE]";
}
((TextView)convertView.findViewById(R.id.cli_street)).setText(street);
((TextView)convertView.findViewById(R.id.cli_city_state_zip)).setText(city+", "+state+" "+zip);
}
}
public View newView(Context context, Cursor cursor, ViewGroup parent) {
LayoutInflater inflater = LayoutInflater.from(context);
View v = inflater.inflate(R.layout.customer_list_item, parent, false);
return v;
}
}
И я уверен, что у Алисы не должно быть адреса фактуры, связанного с этой записью. Вот запрос таблицы из sqlite3. Единственная запись с платежным адресом идентификатор записи Юлиана, как вы можете видеть:
sqlite> .tables
.tables
android_metadata contract location
contact customer phone
sqlite> select * from customer;
select * from customer;
2|Conceptual Systems|||||||
3|Blake Slappey|||||||
4|Julian|1||||||
5|Alice Martin|||||||
Ваш вопрос неоднозначен, и я не думаю, что кто-то понял, что именно представляет собой проблема, поэтому постарайтесь лучше объяснить проблему. Некоторые вещи, которые я могу вам сказать, это: 'convertView' не может быть« null », поэтому проверка бесполезна, также вызываемая' bindView' вызывается для каждой строки в «ListView», и вы не должны запрашивать базу данных там , – Luksprog
проблема была на самом деле довольно понятной. Я даже включил фотографии и весь соответствующий код. кроме того, в адаптере нет транзакций базы данных (которые вы бы знали, если бы посмотрели на код, который я опубликовал). единственная правильная часть вашего комментария заключалась в том, что convertView равен null. поэтому спасибо за это. я могу с радостью удалить две строки кода. потеря этого условного будет значительно ускорить мое приложение. – moonlightcheese
Я думаю, что вы получаете нуль в конце Long billingAddressID для других записей, в 'final Long billingAddressID = cursor.getLong (cursor.getColumnIndex (CustomerSchema.BILLING_ADDRESS_ID));'. и строка 'String.valueOf (billingAddressID)' выдает ошибку. Это на первый взгляд. Позвольте мне попробовать это, и я могу вернуться, если он не был дан ответ уже. Но @stuckless ниже правильно о дизайне – Slartibartfast