Страница 1 из 3

Listview, simplecursoradapter и button.

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

Re: Listview, simplecursoradapter и button.

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

Re: Listview, simplecursoradapter и button.

Добавлено: 07 фев 2014, 21:13
mechanikos
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 и как после этого обращаться к кнопке и прочее

Re: Listview, simplecursoradapter и button.

Добавлено: 07 фев 2014, 22:06
rezak90
для начала попробуй написать кастомный адаптер, среди уроков есть кажется

Re: Listview, simplecursoradapter и button.

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

Re: Listview, simplecursoradapter и button.

Добавлено: 07 фев 2014, 22:54
Foenix
ты уверен вообще, что нужно так реализовывать?
редактирование обычно делают по клику на строке списка, а удаление - свайпом справа налево.

Re: Listview, simplecursoradapter и button.

Добавлено: 07 фев 2014, 22:58
rezak90
mechanikos писал(а):Писал кастомные из baseadapter для простых баз
видимо мало писал раз не понял что я предложил
mechanikos писал(а): проблема в том что здесь мне нужен Simplecursoradapter. иначе придется убирать курсор лоадер и гробить все приложение своими костылями
ничто никуда не уберётся

Re: Listview, simplecursoradapter и button.

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

Re: Listview, simplecursoradapter и button.

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

Re: Listview, simplecursoradapter и button.

Добавлено: 07 фев 2014, 23:23
Foenix

Re: Listview, simplecursoradapter и button.

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

Re: Listview, simplecursoradapter и button.

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

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

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

Re: Listview, simplecursoradapter и button.

Добавлено: 08 фев 2014, 00:30
mdzht
Foenix писал(а): Скажу честно, кнопки в листвью не очень удобная идея.. я такие пробовала делать, но мне очень не понравилось удобство, вернее, неудобство использования и я их убрала, переделав "механику" приложения.
Можно тут по громче? ребята тут интерес погнали

Re: Listview, simplecursoradapter и button.

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

Re: Listview, simplecursoradapter и button.

Добавлено: 08 фев 2014, 10:47
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?

Re: Listview, simplecursoradapter и button.

Добавлено: 08 фев 2014, 13:55
altwin
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 клиент, просто после отправки отображаете индикатор загрузки, пока не придет обновленный ответ сервера.
Можно конечно добавить коментарий в приложении при отсутсвии соединения. а потом синхронизировать, но это бред, а вдруг его сервер не примет, а в каком порядке оно будет и т.д. это все нарушает предсказуемость поведения приложения, вся логика должна быть на сервере.

Re: Listview, simplecursoradapter и button.

Добавлено: 08 фев 2014, 14:01
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

Re: Listview, simplecursoradapter и button.

Добавлено: 08 фев 2014, 14:45
altwin
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;

Re: Listview, simplecursoradapter и button.

Добавлено: 08 фев 2014, 15:05
mechanikos
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. огромная просьба всем не советовать в очередной раз использовать другой адаптер, писать другое приложение, идти в детский сад и т.д. я всего лишь хочу разобраться в проблеме и понять как сделать правильно.

Re: Listview, simplecursoradapter и button.

Добавлено: 08 фев 2014, 15:38
rezak90
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
на верном пути, хоть и кривовато сделано но суть понял