Урок 54. Кастомизация списка. Создаем свой адаптер

Обсуждение уроков
Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 05 сен 2012, 09:58

http://activity-android.blogspot.com/20 ... apter.html вот я здесь описывал как переопределяется SimpleCursorAdapter
R.id.team
Политика на форуме запрещена

Artemko
Сообщения: 26
Зарегистрирован: 16 июл 2012, 15:09

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Artemko » 09 сен 2012, 09:37

как вместо этого заполнения брать данные из массивов в strings.xml?

Код: Выделить всё

void fillData() {
    for (int i = 1; i <= 20; i++) {
      products.add(new Product("Product " + i, i * 1000,
          R.drawable.ic_launcher, false));
    }
  }

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 09 сен 2012, 10:30

getString(R.string.my_name)
R.id.team
Политика на форуме запрещена

Artemko
Сообщения: 26
Зарегистрирован: 16 июл 2012, 15:09

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Artemko » 09 сен 2012, 12:31

Вот есть массив из строк

Код: Выделить всё

<string-array name="product">
    <item>1</item>
    <item>2</item>
    <item>3</item>
    <item>4</item>
    <item>5</item>
</string-array>
как правильно вставить этот массив, чтоб он отображался в кастомном списке:

Код: Выделить всё

void fillData() {
      products.add(new Product("Product ", 1000,  R.drawable.ic_launcher, false));
  }

math64
Сообщения: 235
Зарегистрирован: 16 июл 2012, 07:47

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение math64 » 09 сен 2012, 14:28

Передаёшь R.arrays.product параметров в констрктор ArrayAdapter - есть соответствующий конструктор
Переобределяешь метод getView() чтобы настраивал список как тебе надо.

Аватара пользователя
Xroft
Сообщения: 38
Зарегистрирован: 10 май 2012, 10:11

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Xroft » 11 сен 2012, 20:42

KamiSempai писал(а):Нужно правильно переопределить метод getItemId

Код: Выделить всё

public long getItemId(int position) {
    return (long) Order__id[position];
}
Огромное спасибо! Это то что нужно было:) Респект и уважуха, как говорится)
KamiSempai писал(а):PS: Так как у Вас данные изначально сидят в курсоре, я бы посоветовал использовать SimpleCursorAdapter.
Наверное вы правы ... со временем может и перепишу(когда времени будет больше) ... облегчу код

dil_android
Сообщения: 103
Зарегистрирован: 10 сен 2012, 11:58

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение dil_android » 11 окт 2012, 09:42

Здравствуйте.

Вроде разобрался с адаптерами и смог сделать кастомный. Но, вопрос использования полученных знаний упирается в отсутствие практики программирования, особенно на Андроид с его Intent. Сориентируйте пожалуйста по следующему вопросу. Есть две активити MainActivity и ChildActivity.
MainActivity - список товаров, массив, состоящий из позиций {A, B, C, D, ...}
ChildActivity - список продуктов, тоже массив, состоящий из элементов
{A1, A2, A3, ...}
{B1, B2, B3, ...} и т.д.

При удалении A, должен удаляться и весь {A1, A2, A3, ...} , также и с остальными позициями.
Как использовать Intent, чтобы при удалении A в MainActivity удалялся и весь {A1, A2, A3, ...}, без загрузки ChildActivity.
При удалении А, значение 0 в массиве передается В, поэтому при обращении к В отображается {A1, A2, A3, ...}. Как решить этот вопрос, чтобы после того как B получил значение 0, {B1, B2, B3, ...} также присваивался 0 в ChildActivity?
Если можно, дайте пожалуйста развернутый ответ.
Спасибо.

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 11 окт 2012, 09:55

Исходные данные храни в MainActivity, в ChildActivity передавай то что нужно (передавать с Intent'ом). Напиши свой класс который будет хранить данные твои, например:

Код: Выделить всё

public class Data implements Parcelable {
private String parent;
private String[] child;
//и т.д.
}
В MainActivity создай List<Data> data = ArrayList<Data>(); В лист будешь грузить только parent, а в ChildActivity будешь передавать только объект класса Data вытянутый из списка. В ChildActivity если удаляешь что то то передавай в MainActivity (так как ChildActivity был вызван методом startIntentForResult), например передавай id удаляемого объекта из списка data.
Имхо, лучше юзать для таких дел SimpleCursorAdapter, там всё через курсор делается.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 24 окт 2012, 13:25

Подскажите, пожалуйста, по теме следующее..
При использовании SimpleCursorAdapter ему нужно подать cursor. А у меня есть результат запроса не курсор, а ResultSet:

Код: Выделить всё

ResultSet rs = st.executeQuery(queryString);
Как быть, а то я не знаю куда смотреть, это ж совсем разные классы..
И еще.. если я хочу сделать ListView двухстрочный и галочкой справа для отмечания нужных позиций - понятно, что у меня будет два поля в ResultSet, а третье поле - с нулем для чекбокса - тоже нужно? при отмечании позиций в списке - в это поле будет автоматом заноситься 1 или нужно писать обработку?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 24 окт 2012, 13:29

Думаю что придётся писать всё вручную и использовть практически любой из адаптеров для ListView.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 24 окт 2012, 13:47

Что именно писать вручную?
А данные нельзя перегнать из одного резалтсета в другой...?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 24 окт 2012, 13:54

Вам данные нужно онлайн передавать? Если нет то заполните ArrayList из полученных данных и передайте его адаптеру. При посылке данных на сервер конвертируйте обратно в тот вид который нужен для отправки.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 24 окт 2012, 14:15

мне нужно отмеченные пользователем в listView строчки записать в локальную бд (sqllite)
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 24 окт 2012, 14:35

Тю ну раз в локальную тогда конечно simplecursoradapter полюбому. Или с ним проблемы какие то? Потому что вы так конкретно и не озвучили их.
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 24 окт 2012, 14:48

да я не знаю как из resultset создать cursor, в том-то и вопрос. Не построчно же добавлять..? Строк может быть мнооого. В таблицу sqlite тоже сразу не хочу, т.к. юзер будет выбирать строчки, а их будет несколько штук всего, их и положу в таблицу.
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 24 окт 2012, 15:15

вы не курсор должны заполняеть, а примерно вот так всё должно выглядить:

Код: Выделить всё

DBHelper db = new DBHelper(this, databaseName, null, version);
while(rs.next()) {
db.addData(new Data(rs.getString(0), rs.getString(1)));
}
//Data это как бы класс-контейнер:
public class Data {
private String str1, str2;
public Data(String s1, String s2) {
str1 = s1;
str2 = s2;
}
}
//В DBHelper'e метод дабавляем в бд
public void addData(Data data) {
	SQLiteDatabase db = this.getWritableDatabase();
	ContentValues cv = new ContentValues();
	cv.put("str1", data.getStr1());
	cv.put("str2", data.getStr2());
	db.insert(table_name, null, cv);
	db.close();
}
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 24 окт 2012, 15:36

еще раз, или я так объясняю запутанно, или мы просто друг друга не понимаем. Я хочу данные с удаленной БД (которые я уже получила в resultset) отобразить в ListView. А уже ЗАТЕМ отмеченные загрузить в SQLiteDatabase, мне не нужно все туда запихивать...
Но это уже второй вопрос.
А первый - мне показать надо resultset на экране пользователю, причем с чекбоксами.

Код: Выделить всё

String queryString = "select n as name, a as addr from sometable, 0 as checkb";
ResultSet rs = st.executeQuery(queryString);
я тут добавляю лишний столбик с нулямии в расчете на то, что когда юзер будет щелкать по строчкам в листвью эти checkb будут заполняться единичками.
я думала, раз у него тоже есть эти методы getString, то может как-то переопределить SimpleCursorAdapter как у вас тут описано?
http://activity-android.blogspot.com/20 ... apter.html
только можно ли ему на вход вместо курсора резалтсет забабахать?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 24 окт 2012, 15:42

так тогда в чём проблема передать ResultSet в адаптер и там уже его разбирайте в getView и заполняйте как захотите (только тогда уже использовать придётся не SimpleCursorAdapter а другой обычный).
R.id.team
Политика на форуме запрещена

Аватара пользователя
Foenix
Сообщения: 4201
Зарегистрирован: 20 окт 2012, 12:01

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение Foenix » 24 окт 2012, 15:46

rezak90 писал(а):так тогда в чём проблема передать ResultSet в адаптер и там уже его разбирайте в getView и заполняйте как захотите (только тогда уже использовать придётся не SimpleCursorAdapter а другой обычный).
а как его передать? а так можно?
в какой обычный? cursoradapter? а почему не SimpleCursorAdapter?
R.id.team

NullPointerException - что делать???
viewtopic.php?f=33&t=3899&p=28952#p28952
Где моя ошибка?
viewtopic.php?f=60&t=3198

Аватара пользователя
rezak90
Сообщения: 3422
Зарегистрирован: 26 июн 2012, 13:22
Откуда: UA
Контактная информация:

Re: Урок 54. Кастомизация списка. Создаем свой адаптер

Сообщение rezak90 » 24 окт 2012, 16:14

BaseAdapter or ArrayAdapter, example:

Код: Выделить всё

public class ContactListCursorAdapter extends BaseAdapter {
private Context mContext;
private ResultSet mItems;
public ContactListCursorAdapter(Context context, ResultSet items) {
     mContext = context;
     mItems = items;
}
public int getCount() {
     return mItems .getFetchSize();
}
public Object getItem(int position) {
     return mItems .getObject(position);
}
public long getItemId(int position) {
     return position;
}
public View getView(int position, View convertView, ViewGroup parent) {
    View view = convertView;
    if (view == null) {
         LayoutInflater inflater = (LayoutInflater) mContext.getSystemService(mContext.LAYOUT_INFLATER_SERVICE);
         view = inflater.inflate(layout, parent, false); //layout для строки
    }
    TextView tv = (TextView)view.findViewById(R.id.text); //то что в вашой layout которую используем выше
    //... определяем все нужные вьюшки
    Object obj = getItem(position); //вот здесь посмотри в дебагере что будет в объекте, если будет те данные что нужно вставлять то хорошо, если нет то плохо =) и врятли получится
}
}

R.id.team
Политика на форуме запрещена

Ответить