Listview, simplecursoradapter и button.

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

Listview, simplecursoradapter и button.

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

Соответственно вопрос такой: как подружить листвью составленный с помощью Simplecursoradapter, в каждом итеме кроме текствью и картинки два imagebutton(удалить, реадктировать) и обработку этих самых баттонов? на зарубежных ресурсах находил какие то советы про getView, но к сожалению не смог разобраться что где и как.

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 07 фев 2014, 20:26

Создать класс который будет наследоваться от любого GroupView и который в свою очередь будет "отображать" лейаут (item SimpleCursorAdapter'a). В getView отдавать объект класса который создал. Соответственно тянуть обработчик OnClickListener от активити/фрагмента в адаптер и передавать его в созданный нами класс в котором будет устанавливаться этот обработчик для кнопок.
R.id.team
Политика на форуме запрещена

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

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 07 фев 2014, 21:13

rezak90 писал(а):Создать класс который будет наследоваться от любого GroupView и который в свою очередь будет "отображать" лейаут (item SimpleCursorAdapter'a). В getView отдавать объект класса который создал. Соответственно тянуть обработчик OnClickListener от активити/фрагмента в адаптер и передавать его в созданный нами класс в котором будет устанавливаться этот обработчик для кнопок.
Извните,но не понял вас( вот код

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

public class MainActivity extends FragmentActivity implements LoaderCallbacks<Cursor> {

    ListView lvForms;
    dbForm table_form;
    SimpleCursorAdapter scAdapter;

    /**
     * Called when the activity is first created.
     */
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        table_form=new dbForm(this);
        table_form.open();

        // формируем столбцы сопоставления
        String[] from = new String[]{DBHelper.FORM_NAME, DBHelper.FORM_TITLE};
        int[] to = new int[]{R.id.tvFormName, R.id.tvFormTitle};

        // создааем адаптер и настраиваем список
        scAdapter = new SimpleCursorAdapter(this, R.layout.listform_item, null, from, to, 0);
        lvForms = (ListView) findViewById(R.id.lvForms);
        lvForms.setAdapter(scAdapter);

        // добавляем контекстное меню к списку
        registerForContextMenu(lvForms);

        // создаем лоадер для чтения данных
        getSupportLoaderManager().initLoader(0, null, this);
    }

    // обработка нажатия кнопки
    public void onButtonClick(View view) {
                Intent intent = new Intent(MainActivity.this, LoginActivity.class);
                startActivity(intent);
    }

    protected void onDestroy() {
        super.onDestroy();
        table_form.close();
        // закрываем подключение при выходе
    }

    @Override
    public Loader<Cursor> onCreateLoader(int id, Bundle bndl) {
        return new MyCursorLoader(this, table_form);
    }

    @Override
    public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
        scAdapter.swapCursor(cursor);
    }

    @Override
    public void onLoaderReset(Loader<Cursor> loader) {
    }

    static class MyCursorLoader extends CursorLoader {

        dbForm table_form;

        public MyCursorLoader(Context context, dbForm table_form) {
            super(context);
            this.table_form = table_form;
        }

        @Override
        public Cursor loadInBackground() {
            Cursor cursor = table_form.getAllData();
            return cursor;
        }

    }
}
все есть все отображает, но как теперь прикрутить теперь обработку кнопок в simplecursoradapter? не могу понять как конкретно перегрузить метод getView и как после этого обращаться к кнопке и прочее

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 07 фев 2014, 22:06

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

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

Re: Listview, simplecursoradapter и button.

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

rezak90 писал(а):для начала попробуй написать кастомный адаптер, среди уроков есть кажется
Писал кастомные из baseadapter для простых баз, проблема в том что здесь мне нужен Simplecursoradapter. иначе придется убирать курсор лоадер и гробить все приложение своими костылями. разве нет именно возможности расширить simpleсursoradapter? хочу на его примере понять как это устроить а не в n-й Раз переделывать одно и тоже и стопориться на этом моменте.

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

Re: Listview, simplecursoradapter и button.

Сообщение Foenix » 07 фев 2014, 22:54

ты уверен вообще, что нужно так реализовывать?
редактирование обычно делают по клику на строке списка, а удаление - свайпом справа налево.
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: Listview, simplecursoradapter и button.

Сообщение rezak90 » 07 фев 2014, 22:58

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

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

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 07 фев 2014, 23:09

Foenix писал(а):ты уверен вообще, что нужно так реализовывать?
редактирование обычно делают по клику на строке списка, а удаление - свайпом справа налево.
c редактированием оговорился. по клику на итем открывается форма-опрос, по клику по одной кнопке удаляется, по клику по другой форма грузится на сервер. делал с контекстным меню но этот вариант был выбран человеками как более удобный и симпатичный. Вот и всё уперлось в эту проблему, которую я не могу никак осмыслить после недели кодинга. надеюсь на помощь и конкретный совет, так как кажется что я просто что то упускаю.

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

Re: Listview, simplecursoradapter и button.

Сообщение mechanikos » 07 фев 2014, 23:15

rezak90 писал(а):
mechanikos писал(а):Писал кастомные из baseadapter для простых баз
видимо мало писал раз не понял что я предложил
значит я не понимаю, потому что туп или не нашел грамотного объяснения. Пожалуйста объясните мне уже хотя бы на уровне идиота, есть ли способ расширить simplecursoradapter(написать свой, унаследовашись от него, и переопределить методы) а не городить дополнительные классы. искренне надеюсь на вашу благожелательность. Глаз и мозг абсолютно замылились.

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

Re: Listview, simplecursoradapter и button.

Сообщение Foenix » 07 фев 2014, 23:23

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 » 07 фев 2014, 23:40

Foenix писал(а):тут нет ответа?
https://www.google.ru/search?client=ope ... 8&oe=UTF-8
спасибо,эти ссылки все уже давно фиолетовые(т.е. открыты),туториалы вогеллы заучены как отче наш и я абсолютно запутался. опыта мало и даже со средним знанием английкого часто не со всеми нюансами могу разобраться как именно надо делать и почему. поэтому и написал на форум. обычно обхожусь гуглом. Понимаю что в общем нужно переопределить getView и прилепить к вьюхам тэги но не понимаю как это сделано и как это экстраполировать на свой случай. извиняюсь если занимаю ваше время

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

Re: Listview, simplecursoradapter и button.

Сообщение Foenix » 08 фев 2014, 00:23

попробуй еще раз перечитать урок, где в строке создаются дополнительные элементы (например, чек бокс) и отклик на их нажатие. Затем замени чекбокс кнопкой и опиши обработку ее нажатия, посмотри что получится и так далее.

А если тебе нужно продвинутсья очень быстро, то можно сделать как можно проще (например, через устаревшее контекстное меню) всю обработку и уже потом, когда будет время, разобраться в данном вопросе и заменить меню кнопками.

Скажу честно, кнопки в листвью не очень удобная идея.. я такие пробовала делать, но мне очень не понравилось удобство, вернее, неудобство использования и я их убрала, переделав "механику" приложения.
R.id.team

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

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Listview, simplecursoradapter и button.

Сообщение mdzht » 08 фев 2014, 00:30

Foenix писал(а): Скажу честно, кнопки в листвью не очень удобная идея.. я такие пробовала делать, но мне очень не понравилось удобство, вернее, неудобство использования и я их убрала, переделав "механику" приложения.
Можно тут по громче? ребята тут интерес погнали
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Listview, simplecursoradapter и button.

Сообщение altwin » 08 фев 2014, 02:30

mdzht писал(а):
Foenix писал(а): Скажу честно, кнопки в листвью не очень удобная идея.. я такие пробовала делать, но мне очень не понравилось удобство, вернее, неудобство использования и я их убрала, переделав "механику" приложения.
Можно тут по громче? ребята тут интерес погнали
try this one: https://github.com/47deg/android-swipelistview ( sorry, i don`t have russian keyboard here... ) ;)
Изображение

Аватара пользователя
mdzht
Сообщения: 124
Зарегистрирован: 11 ноя 2013, 11:33
Откуда: fock it
Контактная информация:

Re: Listview, simplecursoradapter и button.

Сообщение mdzht » 08 фев 2014, 10:47

altwin писал(а): try this one: https://github.com/47deg/android-swipelistview ( sorry, i don`t have russian keyboard here... ) ;)
An arabic commentator would say "h-Alllllaaaaah.."(grateful), what about comment box in android app altwin?
«Life is too short to spend rewriting code»

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Listview, simplecursoradapter и button.

Сообщение altwin » 08 фев 2014, 13:55

mdzht писал(а):
altwin писал(а): try this one: https://github.com/47deg/android-swipelistview ( sorry, i don`t have russian keyboard here... ) ;)
An arabic commentator would say "h-Alllllaaaaah.."(grateful), what about comment box in android app altwin?
только REST API я даже не представляю, как это сделать иначе. Вы просто открываете диалог предлогая пользователю ввести текст комментария и отправляете его серверу, получаете новый ответ и обновляете комментарии в приложении. Здесь никких особенных библотек не нужно(только если конкретный web ресурс свою готовую имеет по типу facebook), любой REST клиент, просто после отправки отображаете индикатор загрузки, пока не придет обновленный ответ сервера.
Можно конечно добавить коментарий в приложении при отсутсвии соединения. а потом синхронизировать, но это бред, а вдруг его сервер не примет, а в каком порядке оно будет и т.д. это все нарушает предсказуемость поведения приложения, вся логика должна быть на сервере.
Изображение

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

Re: Listview, simplecursoradapter и button.

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

что ж попрошу помощи еще раз)
решил я все таки писать свой кастомадаптер унаследованный от simplecursoradapter. надеюсь люди увидят что я не прошу готовое решение а просто совет. вот код

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

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

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView != null) {
                return convertView;
            }

            return LayoutInflater.from(ctx).inflate(R.layout.listform_item, null);
        }

        @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()
                    ;


                }
            });


        }
    }

к сожалению теперь итемы у меня отображаются но без текста. так же вопрос опять по баттону, на верном ли я пути и как все таки связать его с конкретным id

Аватара пользователя
altwin
Сообщения: 1951
Зарегистрирован: 13 ноя 2013, 14:46

Re: Listview, simplecursoradapter и button.

Сообщение altwin » 08 фев 2014, 14:45

mechanikos писал(а):что ж попрошу помощи еще раз)
решил я все таки писать свой кастомадаптер унаследованный от simplecursoradapter. надеюсь люди увидят что я не прошу готовое решение а просто совет. вот код

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

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

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView != null) {
                return convertView;
            }

            return LayoutInflater.from(ctx).inflate(R.layout.listform_item, null);
        }

        @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()
                    ;


                }
            });


        }
    }

к сожалению теперь итемы у меня отображаются но без текста. так же вопрос опять по баттону, на верном ли я пути и как все таки связать его с конкретным id
Я не совсем понял вопроса.. видимо у вас есть предыдущие сообщения... но на сколько я понял вам нужно получить view элементы. Во первых зачем вам SimpleCursorAdapter? почему не BaseAdapter? (следуюет ответить на эотт вопрос для себя, как минимум вы хорошо разберетесь, что это вообще такое...). У вас есть метод getView(), который возвращает то, что будет отображаться. Для начала присвойте значение переменной:
[syntax=java5]
final View result;
if (convertView == null) {
result = LayoutInflater.from(parent.getContext()).inflate(R.layout.listform_item, parent, false);
} else {
result = convertView;
}
[/syntax]
Далее раз у вас есть несколько view элементов, то наверно и какая то структура в которой сохранены значения, к примеру простой Мар:
[syntax=java5]
Map.Entry<String, String> item = getItem(position); // это тоже @Override метод в котором вы получаете item

// TODO replace findViewById by ViewHolder
((TextView) result.findViewById(android.R.id.text1)).setText(item.getKey());
((TextView) result.findViewById(android.R.id.text2)).setText(item.getValue());
[/syntax]
это просто простой пример, надеюсь суть понятна, у вас значения должный быть где то сохранены откуда вы и и берете и не важно TextView/ImageView или что то там вью...

После выполнения всех этих манипуляций getView() просто: return result;
Изображение

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

Re: Listview, simplecursoradapter и button.

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

altwin писал(а): Я не совсем понял вопроса.. видимо у вас есть предыдущие сообщения... но на сколько я понял вам нужно получить view элементы. Во первых зачем вам SimpleCursorAdapter? почему не BaseAdapter? (следуюет ответить на эотт вопрос для себя, как минимум вы хорошо разберетесь, что это вообще такое...). У вас есть метод getView(), который возвращает то, что будет отображаться. Для начала присвойте значение переменной:
[syntax=java5]
final View result;
if (convertView == null) {
result = LayoutInflater.from(parent.getContext()).inflate(R.layout.listform_item, parent, false);
} else {
result = convertView;
}
[/syntax]
Далее раз у вас есть несколько view элементов, то наверно и какая то структура в которой сохранены значения, к примеру простой Мар:
[syntax=java5]
Map.Entry<String, String> item = getItem(position); // это тоже @Override метод в котором вы получаете item

// TODO replace findViewById by ViewHolder
((TextView) result.findViewById(android.R.id.text1)).setText(item.getKey());
((TextView) result.findViewById(android.R.id.text2)).setText(item.getValue());
[/syntax]
это просто простой пример, надеюсь суть понятна, у вас значения должный быть где то сохранены откуда вы и и берете и не важно TextView/ImageView или что то там вью...

После выполнения всех этих манипуляций getView() просто: return result;

начнем с того что я топикстартер) дальше, я использую именно этот адаптер т.к. исходные данные у меня в БД, предпологается их довольно большое количество и я загружаю их в листвью с помощью cursorloader. остальные вопросы я задал выше.
P.S. огромная просьба всем не советовать в очередной раз использовать другой адаптер, писать другое приложение, идти в детский сад и т.д. я всего лишь хочу разобраться в проблеме и понять как сделать правильно.

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

Re: Listview, simplecursoradapter и button.

Сообщение rezak90 » 08 фев 2014, 15:38

mechanikos писал(а):что ж попрошу помощи еще раз)
решил я все таки писать свой кастомадаптер унаследованный от simplecursoradapter. надеюсь люди увидят что я не прошу готовое решение а просто совет. вот код

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

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

        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            if (convertView != null) {
                return convertView;
            }

            return LayoutInflater.from(ctx).inflate(R.layout.listform_item, null);
        }

        @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()
                    ;


                }
            });


        }
    }

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

Ответить