Listview, simplecursoradapter и button.

Activity Lifecycle, Saving Activity State, Managing Tasks, Intent, Intent Filter
mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 15:59

rezak90 писал(а):
mechanikos писал(а):что ж попрошу помощи еще раз)

к сожалению теперь итемы у меня отображаются но без текста. так же вопрос опять по баттону, на верном ли я пути и как все таки связать его с конкретным id
на верном пути, хоть и кривовато сделано но суть понял
подскажите в чем может быть причина пустых текствью? судя по тому что я рандомно изменял количество запизей в базу(предзаполнял в дбхелпере), курсорлоадер нормально скармливает курсор моему адаптеру. ошибка в BindView или я что то не дописал?
P.S. в данный момент разбираюсь с http://activity-android.blogspot.ru/201 ... apter.html(насколько я понял это ваша статья,спасибо) и не могли бы вы перезалить проект на файлообменники, хочу поэксперементировать с вашим примером

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

Re: Listview, simplecursoradapter и button.

Сообщение Foenix » 08 фев 2014, 16:18

проверь, что у тебя в курсоре творится
скопировать код там кнопка у него есть
R.id.team

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

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 16:31

Foenix писал(а):проверь, что у тебя в курсоре творится
скопировать код там кнопка у него есть
глупый вопрос но как посмотреть? если вы про отладочный вывод то я туплю куда его влепить удобно было бы

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 16:36

mechanikos писал(а):P.S. в данный момент разбираюсь с http://activity-android.blogspot.ru/201 ... apter.html (насколько я понял это ваша статья,спасибо) и не могли бы вы перезалить проект на файлообменники, хочу поэксперементировать с вашим примером
мой блог двухлетней давности))) я уже и сам про него забыл, у меня и доступа то к нему уже нету.
mechanikos писал(а):подскажите в чем может быть причина пустых текствью?
нужно дебажить
R.id.team
Политика на форуме запрещена

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 16:51

rezak90 писал(а):
mechanikos писал(а):P.S. в данный момент разбираюсь с http://activity-android.blogspot.ru/201 ... apter.html (насколько я понял это ваша статья,спасибо) и не могли бы вы перезалить проект на файлообменники, хочу поэксперементировать с вашим примером
мой блог двухлетней давности))) я уже и сам про него забыл, у меня и доступа то к нему уже нету.
mechanikos писал(а):подскажите в чем может быть причина пустых текствью?
нужно дебажить
У меня появилась крамольная мысль переделать ваш адаптер под свои нужды,если вы не против. Вы сказали по поводу предыдущего моего кода что я на правильному пути. Правильно ли я понимаю что методы getView(из моего адаптера) и newView - предназначены для одного и того же? и еще раз повторю вопрос про идентификацию баттонов: как все таки мне их детектить? как определять к какому итему(даже не итему а id записи в БД) они относятся? если вам не трудно покажите с примером.

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 17:11

Вот твой кусок кода:
[syntax=java5]@Override
public void bindView(View view, Context context, Cursor cursor) {
String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME));
String title = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_TITLE));
TextView formname = (TextView) findViewById(R.id.tvFormName);
formname.setText(name);
TextView formtitle=(TextView) findViewById(R.id.tvFormTitle);
formtitle.setText(title);
ImageButton yourButton = (ImageButton) findViewById(R.id.ibtnDelete);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(ctx, "Delete button Clicked",
Toast.LENGTH_LONG).show();
}
});
}[/syntax]
Вот немножко модифицирован:
[syntax=java5]@Override
public void bindView(View view, Context context, Cursor cursor) {
String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME));
String title = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_TITLE));
TextView formname = (TextView) findViewById(R.id.tvFormName);
formname.setText(name);
TextView formtitle=(TextView) findViewById(R.id.tvFormTitle);
formtitle.setText(title);
ImageButton yourButton = (ImageButton) findViewById(R.id.ibtnDelete);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(view != null) {
Object obj = view.getTag();
if(obj != null && obj instanceof Integer) {
Toast.makeText(ctx, "Delete row with id = " + ((Integer)obj).intValue(), Toast.LENGTH_LONG).show();
}
}
}
});
Object obj = cursor.getInt(DBHelper.FORM_ID);
yourButton.setTag(obj);
}[/syntax]
R.id.team
Политика на форуме запрещена

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 19:34

rezak90 писал(а):Вот твой кусок кода:
[syntax=java5]@Override
public void bindView(View view, Context context, Cursor cursor) {
String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME));
String title = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_TITLE));
TextView formname = (TextView) findViewById(R.id.tvFormName);
formname.setText(name);
TextView formtitle=(TextView) findViewById(R.id.tvFormTitle);
formtitle.setText(title);
ImageButton yourButton = (ImageButton) findViewById(R.id.ibtnDelete);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(ctx, "Delete button Clicked",
Toast.LENGTH_LONG).show();
}
});
}[/syntax]
Вот немножко модифицирован:
[syntax=java5]@Override
public void bindView(View view, Context context, Cursor cursor) {
String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME));
String title = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_TITLE));
TextView formname = (TextView) findViewById(R.id.tvFormName);
formname.setText(name);
TextView formtitle=(TextView) findViewById(R.id.tvFormTitle);
formtitle.setText(title);
ImageButton yourButton = (ImageButton) findViewById(R.id.ibtnDelete);
yourButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
if(view != null) {
Object obj = view.getTag();
if(obj != null && obj instanceof Integer) {
Toast.makeText(ctx, "Delete row with id = " + ((Integer)obj).intValue(), Toast.LENGTH_LONG).show();
}
}
}
});
Object obj = cursor.getInt(DBHelper.FORM_ID);
yourButton.setTag(obj);
}[/syntax]
Хотел спросить у вас чем собственно отличаются getView и newView? везде вижу что и про то и про то пишут что они нужны для создания View. не могу уловить разницу и их применение. Например почему вы в своем примере в том старом блоге перегружали именно newView?

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 19:46

потому что у CursorAdapter инициализация view идёт в методе newView
R.id.team
Политика на форуме запрещена

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 19:57

rezak90 писал(а):потому что у CursorAdapter инициализация view идёт в методе newView
Ага, стоило мне удалить из моего адаптера getView и перегрузить newView как в итемах все отобразилось.Получается что везде вьюхи иницируются в getView а только в курсор адаптере подругому или как?
Не понимаю только какого черта во всех гайдах(в том числе урок 54 про кастомадаптер из baseadapter) и на stackoverflow советуют перегружать getView. насколько я понял идея там в конвертвью для отображения уже созданных вьюх без повторного инфлэйта, но почему тогда нигде не указывают ничего про newView. если вам не трудно и вы в курсе, проясните пожалуйста этот механизм.

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 20:47

я же написал что newView только для курсор адаптеров, остальные адаптеры используют просто getView... разница в наследниках
R.id.team
Политика на форуме запрещена

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 20:55

rezak90 писал(а):я же написал что newView только для курсор адаптеров, остальные адаптеры используют просто getView... разница в наследниках
спасибо, буду значит считать что это не баг а фича. просто я думал раз курсорадаптер потомок baseadapter то и методы работы должны совпадать. последний вопрос: "Метод getView должен возвращать View пункта списка. Для этого мы создавали layout-ресурс R.layout.item. В этом методе мы должны из R.layout.item создать View, заполнить его данными и отдать списку. Но перед тем как создавать, мы пробуем использовать convertView, который идет на вход метода. Это уже созданное ранее View, но неиспользуемое в данный момент. Например, при прокрутке списка, часть пунктов уходит за экран и их уже не надо прорисовывать. View из этих «невидимых» пунктов используются для новых пунктов. Нам остается только заполнить их данными. Это значительно ускоряет работу приложения, т.к. не надо прогонять inflate лишний раз." - возможно такое же реализовать для курсор адаптера,ведь получается что я каждый раз инфлэйтю итем списка при пролистывании ? или я что то упустил?

P.S. курю доки гугловские но не нашел никаких пояснений

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 21:09

Просто достаточно посмотреть в исходники CursorAdapter метода getView:
[syntax=java5]public View getView(int position, View convertView, ViewGroup parent) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindView(v, mContext, mCursor);
return v;
}[/syntax]
P.S. надеюсь комментировать этот кусок не нужно?! :)
R.id.team
Политика на форуме запрещена

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 21:22

rezak90 писал(а):Просто достаточно посмотреть в исходники CursorAdapter метода getView:
[syntax=java5]public View getView(int position, View convertView, ViewGroup parent) {
if (!mDataValid) {
throw new IllegalStateException("this should only be called when the cursor is valid");
}
if (!mCursor.moveToPosition(position)) {
throw new IllegalStateException("couldn't move cursor to position " + position);
}
View v;
if (convertView == null) {
v = newView(mContext, mCursor, parent);
} else {
v = convertView;
}
bindView(v, mContext, mCursor);
return v;
}[/syntax]
P.S. надеюсь комментировать этот кусок не нужно?! :)
ахахах вот блин матрёшка,если я не совсем тупой то просто если вьюхи нет то гетвью вызывает ньювью а потом биндит ) я то думал они чем то принципиально отличаются. если не секрет как открыть исходники методов? интересно теперь посмотреть исходник самого newView и найти все таки причину почему в курсорадаптерах используется исключительно ньювью.

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 21:43

В коде же видно почему используется newView, к тому же по названию методов newView и bindView можно понять почему
P.S. исходники лежат в локальном sdk.
R.id.team
Политика на форуме запрещена

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 21:59

rezak90 писал(а):В коде же видно почему используется newView, к тому же по названию методов newView и bindView можно понять почему
P.S. исходники лежат в локальном sdk.
спасибо, за пару часов общения с вами понял, больше чем за неделю) кстати я попробовал модфицировать bindView по вашему совету выше, но android studio ругается на ctx в Toast.makeText(ctxt, "Delete row with id = " + ((Integer)obj).intValue(), Toast.LENGTH_LONG).show(); а именно "Variable 'ctxt' is accessed from within inner class. Needs to be declared final", в силу неопытности и усталости не могу понять что не так и что делать

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 22:05

держать ссылку на ctx вообще не нужно, в bindView приходит Context, вот его и используй
R.id.team
Политика на форуме запрещена

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 22:08

rezak90 писал(а):держать ссылку на ctx вообще не нужно, в bindView приходит Context, вот его и используй
я это сразу сделал только немного на обророт "public void bindView(View view, Context ctx, Cursor cursor)", но увы. не могу понять в чем проблема. надо где то в классе контекст инициализовать?

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

Re: Listview, simplecursoradapter и button.

Сообщение Foenix » 08 фев 2014, 22:33

ctx а не ctxt писать надо, переменная вроде ж так назвается
R.id.team

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

mechanikos
Сообщения: 33
Зарегистрирован: 30 сен 2013, 12:14

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 08 фев 2014, 22:39

Foenix писал(а):ctx а не ctxt писать надо, переменная вроде ж так назвается
да не в имени переменной дело.

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

public void bindView(View view, Context Context, Cursor cursor) {
        String name = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_NAME));
        String title = cursor.getString(cursor.getColumnIndex(DBHelper.FORM_TITLE));
        TextView formname = (TextView)view.findViewById(R.id.tvFormName);
        formname.setText(name);
        TextView formtitle=(TextView)view.findViewById(R.id.tvFormTitle);
        formtitle.setText(title);
        ImageButton yourButton = (ImageButton)view.findViewById(R.id.ibtnDelete);
        yourButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                if(view != null) {
                    Object obj = view.getTag();
                    //if(obj != null && obj instanceof Integer) {
                        Toast.makeText(Context, "Delete row with id = " + obj.toString(), Toast.LENGTH_LONG).show();

                }
            }
        });
вышел из положения костылем типа

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

Context context;
    public MySimpleCursorAdapter(Context context, int layout, Cursor c, String[] from, int[] to, int flags) {
        super(context, layout, c, from, to, flags);
        this.context=context;

    }
и передал тосту context


сейчас другой вопрос возник, а как можно тэг кнопки вытащить? или саму процедуру удаления записи тут же и проводить в кастом адаптере(т.е. создавать объект dbForm, вызвать его метод deleteform и прочее)?

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 22:42

mechanikos писал(а):
rezak90 писал(а):держать ссылку на ctx вообще не нужно, в bindView приходит Context, вот его и используй
я это сразу сделал только немного на обророт "public void bindView(View view, Context ctx, Cursor cursor)", но увы. не могу понять в чем проблема. надо где то в классе контекст инициализовать?
Это уже от незнания ООП, в обработчике OnClickListener уже другая область видимости, и соответственно компилятор просит объект класса Context который ссылается за пределы этого интерфейса сделать final.
P.S. По "красивому" OnClickListener нужно вынести в активити/фрагмент, там есть ссылка на контекст.
R.id.team
Политика на форуме запрещена

Ответить