Страница 4 из 14
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 28 окт 2012, 15:20
dil_android
Решил, что негоже иметь два чекбокса, может из-за этого вылетает ошибка, поэтому инкорпорировал save и load методы в адаптер. Нормально работает, только одно, очень существенное, но. У меня два списка: в Main activity и в Child activity. Если я чекаю в строке 1 пункта 1 (position=1) Child activity, и после выхода в Main activity, захожу в Child activity еще раз, но уже в пункт 2, то сохраненная position=1 отчекивает первую строку в обоих пунктах 1 и 2.
Понятно, что сохранение состояния checkbox происходит по position, а position в обоих случаях =1. Есть ли возможность обойти это препятствие?
|пункт 1 строка 1 position 1 checked
строка 2 position 2
строка 3 position 3
|пункт 2 строка 1 position 1 checked
строка 2 position 2
строка 3 position 3
Код: Выделить всё
// пункт списка
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// используем созданные, но не используемые view
View view = convertView;
if (view == null) {
view = lInflater.inflate(R.layout.childitem, parent, false);
}
Product p = getProduct(position);
// заполняем View в пункте списка данными из товаров: наименование, цена
// и картинка
((TextView) view.findViewById(R.id.tvDescr)).setText(p.name);
((TextView) view.findViewById(R.id.tvPrice)).setText(p.price + "");
((ImageView) view.findViewById(R.id.ivImage)).setImageResource(p.image);
CheckBox cbBuy = (CheckBox) view.findViewById(R.id.cbBox);
// пишем позицию
cbBuy.setTag(position);
// заполняем данными из товаров: в корзине или нет
cbBuy.setChecked(p.box);
// загружаем сохраненный checkbox
cbBuy.setChecked(load(position));
// присваиваем чекбоксу обработчик
cbBuy.setOnCheckedChangeListener(new OnCheckedChangeListener() {
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
Log.d("Check", "Changing position to" + position + " " + isChecked);
mIsChecked[position] = isChecked;
savebox(position, isChecked);
// меняем данные товара (в корзине или нет)
getProduct((Integer) buttonView.getTag()).box = isChecked;
}
});
return view;
}
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 15 ноя 2012, 00:06
Foenix
Уже вовсю кастомизирую с вашей помощью разные списки, спасибо!!
Вопрос такой по xml, в которой описывается одна строчка кастомного списка.
Есть по-простому два textview. В одном, допустим, название, а в другом, допустим (рядышком, напротив названия) - цена. Примерно так(чуть-чуть криво получилось):
Код: Выделить всё
Пирожок с капустой 100.0
Ваннна металлическая 10 000.0
Еще-что-то-там-такое
-не помещающееся 3 000.0
Никак не могу добиться того, чтоб цене, выровненной по правому краю, определить ширину столько, сколько ей надо для отображения данных без wrap(!) (например может быть 100р. а может быть 10000), а названию - все оставшееся в строчке место.
Вот наоборот, чтоб первому ширину задать, а второй все место занимал - у меня как-то получилось, а вот пришпилить это к правому краю никак не получается, разве что задавать пропорции, но мне совсем не это надо.
Я названию делаю fill_parent, задав жестко ширину цены, а оно уменя кудато за границы экрана шурует цену.
Короче, вот мой xml (только там две строчки, а не одна, но они должны бытьв се равно одинаковыми)
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvName1"
android:layout_width="209dp"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:layout_weight="0.53"
android:text="Medium Text"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/tvSklad"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:width="100dp" />
</LinearLayout>
<LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content" >
<TextView
android:id="@+id/tvName2"
android:layout_width="208dp"
android:layout_height="wrap_content"
android:layout_weight="0.88"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall" />
<TextView
android:id="@+id/tvPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right|center_vertical"
android:text="Small Text"
android:textAppearance="?android:attr/textAppearanceSmall"
android:width="100dp" />
</LinearLayout>
</LinearLayout>
</LinearLayout>
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 15 ноя 2012, 00:32
rezak90
вариантов как такое сделать куча, например:
1) использовать не LinearLayout, а RelativeLayout и там вы спокойно можете свой TextView разместить по правому краю, и соответственно ширина и высота wrap_content.
2) сделать так как вы сделали но поиграться с layout_weight
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 15 ноя 2012, 11:33
Foenix
я с весами уже пробовала, не получается, это не то, если я хочу чтобы цена помещалась на 100%. Какое вообще должно быть свойство, чтобы варьировать ширину по тексту, чтоб он не сворачивался в другую строчку?
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 15 ноя 2012, 11:52
rezak90
я ж говорю используйте тогда RelativeLayout, и будет вам счастье =)
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 20 ноя 2012, 13:46
Foenix
может кому-то понадобится
переделала взяв пример отсюда
http://developer.android.com/guide/topi ... ative.html, т.к. там более-менее похоже
- все получилось
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 09 янв 2013, 12:24
heluvet
Добрый день, господа!
Есть цель вставить в элемент списка миниатюру фотографии. Даже не фотографии, а части фотографии. Как, например, при добавлении нового контакта - выбираешь фотографию, и открывается активити с возможностью выбора зоны отображения.
Так вот, каким образом можно реализовать выбор области отображения?
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 07 мар 2013, 14:40
shatl
Всем привет!Не могу запустить данный код, выдает 1 ошибку /** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main); <----- main подчеркнуто красной линией и не запускаеться.Зачем это здесь вообще, я уже новый лэйаут создал с id main, подскажите пожалуйста, в чем ошибка.
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 07 мар 2013, 14:45
Foenix
Посмотри в логах ошибок, красным будет написано. Скоре всего у тебя ошибка в xml - файле каком-нибудь.
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 07 мар 2013, 15:05
shatl
Я открыл логкэт, там он ни чего не пише.Запускаю код в эмулятор, не пускает пишет: Your project contains errors, plz fix them before running your application. Зачем вообще тут этот main, если в проекте всего два лэйаута и они у меня есть и id там есть, а он та откуда взялся этот main?=\
PS так вроде понял я думал здесь нужен ID, вообщем переименовал XML
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 10 мар 2013, 13:19
shatl
В коде ни каких ошибок не выдает, при запуске в эмуляторе не запускаеться.Что делать? Может ни тот дивайс, если да то какой нужен?=\
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 10 мар 2013, 13:22
Foenix
Да выдает там все, что нужно..но не в логкет а в констоли значит.
Ну перезапусти девайс и эклипс, если не можешь найти и почитать в чем ошибки..
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 10 мар 2013, 13:33
shatl
03-10 10:18:30.149: D/AndroidRuntime(352): Shutting down VM
03-10 10:18:30.149: W/dalvikvm(352): threadid=1: thread exiting with uncaught exception (group=0x40015560)
03-10 10:18:30.190: E/AndroidRuntime(352): FATAL EXCEPTION: main
03-10 10:18:30.190: E/AndroidRuntime(352): java.lang.ClassCastException: android.widget.LinearLayout
03-10 10:18:30.190: E/AndroidRuntime(352): at ru.example.df.BoxAdapter.getView(BoxAdapter.java:62)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.AbsListView.obtainView(AbsListView.java:1430)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.makeAndAddView(ListView.java:1745)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.fillDown(ListView.java:670)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.fillFromTop(ListView.java:727)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.ListView.layoutChildren(ListView.java:1598)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.AbsListView.onLayout(AbsListView.java:1260)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.setChildFrame(LinearLayout.java:1254)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.layoutVertical(LinearLayout.java:1130)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.LinearLayout.onLayout(LinearLayout.java:1047)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.widget.FrameLayout.onLayout(FrameLayout.java:338)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.View.layout(View.java:7175)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.ViewRoot.performTraversals(ViewRoot.java:1140)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.view.ViewRoot.handleMessage(ViewRoot.java:1859)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.os.Handler.dispatchMessage(Handler.java:99)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.os.Looper.loop(Looper.java:123)
03-10 10:18:30.190: E/AndroidRuntime(352): at android.app.ActivityThread.main(ActivityThread.java:3683)
03-10 10:18:30.190: E/AndroidRuntime(352): at java.lang.reflect.Method.invokeNative(Native Method)
03-10 10:18:30.190: E/AndroidRuntime(352): at java.lang.reflect.Method.invoke(Method.java:507)
03-10 10:18:30.190: E/AndroidRuntime(352): at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:839)
03-10 10:18:30.190: E/AndroidRuntime(352): at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:597)
03-10 10:18:30.190: E/AndroidRuntime(352): at dalvik.system.NativeStart.main(Native Method)
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 10 мар 2013, 18:57
Foenix
ЭТо называется нет ошибок?
да там же прямая ссылка на строку с ошибкой в программе. Щелкай туда два раза.
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 24 мар 2013, 22:21
erNesto
доброго вермени суток) столкнулся вот с такой проблемой: у меня есть адаптер, в котором 2 текст вьюва и 1 кнопка... по нажатию на кнопку, нужно удалить именно тот елемент, которому пренадлежит эта кнопка... каким образом это делаеться?) заранее спасибо)
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 24 мар 2013, 22:38
rezak90
erNesto писал(а):доброго вермени суток) столкнулся вот с такой проблемой: у меня есть адаптер, в котором 2 текст вьюва и 1 кнопка... по нажатию на кнопку, нужно удалить именно тот елемент, которому пренадлежит эта кнопка... каким образом это делаеться?) заранее спасибо)
1) вешается обработчик на кнопку, в кнопку помещается в тег номер позиции в списке, после нажатия вытаскиваем с тега позицию и по ней удаляем запись
2) или используем класс ViewHolder в котором по принципу первого варианта делаем поле в котором храним позицию
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 03 апр 2013, 17:10
Artem
Добрый день!
Спасибо за урок, все понятно.
Подскажите, как реализовать в таком списке с кастомным адаптером обработку нажатия на элемент списка. Простая установка обработчика для списка через
setOnItemClickListener к результату не приводит. При этом элемент даже не подсвечивается при нажатии. Пробовал устанавливать
для элемента в item.xml, тоже безрезультатно...
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 04 апр 2013, 00:54
KamiSempai
rezak90 писал(а):показывайте код, то что вы пытались не о чём не говорит
Пост в будущее? Я подозревал, что ты не простой человек)
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 04 апр 2013, 16:19
Artem
показывайте код, то что вы пытались не о чём не говорит
MainActivity.java
Код: Выделить всё
package com.example.tmp;
import java.util.ArrayList;
import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;
public class MainActivity extends Activity {
ArrayList<Product> products = new ArrayList<Product>();
BoxAdapter boxAdapter;
/** Called when the activity is first created. */
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// создаем адаптер
fillData();
boxAdapter = new BoxAdapter(this, products);
// настраиваем список
ListView lvMain = (ListView) findViewById(R.id.lvMain);
lvMain.setAdapter(boxAdapter);
lvMain.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
showMessage();
}
});
}
public void showMessage() {
String msg = "Нажатие на элемент списка";
Toast.makeText(this, msg, Toast.LENGTH_LONG).show();
}
// генерируем данные для адаптера
void fillData() {
for (int i = 1; i <= 20; i++) {
products.add(new Product("Product " + i, i * 1000,
R.drawable.ic_launcher, false));
}
}
// выводим информацию о корзине
public void showResult(View v) {
String result = "Товары в корзине:";
for (Product p : boxAdapter.getBox()) {
if (p.box)
result += "\n" + p.name;
}
Toast.makeText(this, result, Toast.LENGTH_LONG).show();
}
}
item.xml
Код: Выделить всё
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:clickable="true"
android:orientation="horizontal">
<CheckBox
android:id="@+id/cbBox"
android:layout_width="wrap_content"
android:layout_height="wrap_content">
</CheckBox>
<LinearLayout
android:id="@+id/linearLayout1"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_marginLeft="5dp"
android:layout_weight="1"
android:orientation="vertical">
<TextView
android:id="@+id/tvDescr"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_marginTop="5dp"
android:text=""
android:textSize="20sp">
</TextView>
<TextView
android:id="@+id/tvPrice"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:layout_marginRight="10dp"
android:text="">
</TextView>
</LinearLayout>
<ImageView
android:id="@+id/ivImage"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/ic_launcher">
</ImageView>
</LinearLayout>
Re: Урок 54. Кастомизация списка. Создаем свой адаптер
Добавлено: 05 апр 2013, 16:01
rezak90
показывайте код, то что вы пытались не о чём не говорит