Форум программистов, компьютерный форум, киберфорум
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
Slon747
59 / 37 / 2
Регистрация: 24.08.2013
Сообщений: 545
1

Кастомизация списков

02.10.2013, 17:15. Просмотров 1397. Ответов 4
Метки нет (Все метки)

В инете есть множество примеров изменение внешнего вида ListView с помощью кастомизации и разработкой собственного адаптера. Но везде встрачаю нечто подобное:
Java
1
2
3
4
5
String[] values = new String[] { "Android", "iPhone", "WindowsMobile",
                "Blackberry", "WebOS", "Ubuntu", "Windows7", "Max OS X",
                "Linux", "OS/2" };
        MySimpleArrayAdapter adapter = new MySimpleArrayAdapter(this, values);
        setListAdapter(adapter);
Т.е. используется одномерный массив.
Мне не понятно, зачем и где может понадобится список, не имеющий идентификаторов?
Разве что по позиции получать элемент массива?
И нигде не видел пример кастомизации списка с SimpleCursorAdapter для хранения в списке "Ключ-Значение".

Вопрос, можно ли такое осуществить или придется получать выборку из БД и в цикле заполнять список, при этом параллельно заполняя массив, в котором будет храниться связь между позицией элемента в списке и его идентификатором в БД?
0
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 17:15
Ответы с готовыми решениями:

кастомизация приложения
Когда вся техническая часть приложения написана и работает, остаётся только сделать приложение...

Кастомизация ListView
Добрый день. Перерыл пол инета но так и не нашел нормальный мануал как можно скастомизировать...

Кастомизация ListView
Добрый день. Создаю прокручиваемый список, в каждом поле четыре строки, проблема в написании кода....

Кастомизация ListView
http://imglink.ru/pictures/15-06-14/3d97212a44f93f016eb14cfbf868d023.jpg Как реализовать...

4
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
02.10.2013, 17:25 2
При создании своего адаптера, можно использовать любые типы данных.
Вот пример из проекта над которым работаю:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
private static class OrderAdapter extends ArrayAdapter<Dish> {
        
        public static final String ARG_OLD_COUNT = "ARG_OLD_COUNT";
        public static final String ARG_DISH_ID = "ARG_DISH_ID";
        public static final String ARG_DISH_POSITION = "ARG_DISH_POSITION";
        
        private List<Dish> items;
        private LayoutInflater inflater;
        private FragmentManager fragmentManager;
        
        private ImageLoader imageLoader = ImageLoader.getInstance();
        private DisplayImageOptions options;
 
        public OrderAdapter(ActionBarActivity context, List<Dish> objects) {
            super(context, R.layout.order_list_item, objects);
            inflater = LayoutInflater.from(context);
            fragmentManager = context.getSupportFragmentManager();
            this.items = objects;
            
            options = new DisplayImageOptions.Builder()
                        .cacheInMemory(true)
                        .cacheOnDisc(true)
                        .displayer(new FadeInBitmapDisplayer(400))
                        .bitmapConfig(Bitmap.Config.RGB_565)
                        .build();
        }
        
        @Override
        public View getView(final int position, View convertView, ViewGroup parent) {
            final ViewHolder holder;
            if(convertView == null) {
                holder = new ViewHolder();
                convertView = inflater.inflate(R.layout.order_list_item, null);
                holder.name = (TextView) convertView.findViewById(R.id.order_item_name);
                holder.price = (TextView) convertView.findViewById(R.id.order_item_price);
                holder.count = (TextView) convertView.findViewById(R.id.order_item_count);
                holder.icon = (ImageView) convertView.findViewById(R.id.order_item_icon);
                holder.countPicker = convertView.findViewById(R.id.count_layout);
                holder.position = position;
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            
            final Dish item = items.get(position);
            
            holder.name.setText(item.name);
            holder.price.setText(item.price);
            holder.count.setText(String.valueOf(item.getCount()));
            
            if(item.image_url_small != null && item.image_url_small.length() > 0) {
                imageLoader.displayImage(item.image_url_small, holder.icon, options);
            }
            
            holder.countPicker.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    NumberPickerDialog dialog = new NumberPickerDialog();
                    Bundle args = new Bundle();
                    args.putInt(ARG_OLD_COUNT, item.getCount());
                    args.putString(ARG_DISH_ID, item.id);
                    args.putInt(ARG_DISH_POSITION, holder.position);
                    dialog.setArguments(args);
                    dialog.show(fragmentManager, "CountPicker");
                }
            });
            
            return convertView;
        }
        
        static class ViewHolder {
            TextView name;
            TextView price;
            TextView count;
            ImageView icon;
            View countPicker;
            int position;
        }
        
    }
Создание адаптера:
Java
1
2
List<Dish> dish = ...;
OrderAdapter mAdapter = new OrderAdapter(this, dish);
Выбор элемента по позиции при клике:
Java
1
2
3
4
5
6
7
8
orderListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> arg0, View arg1, int position, long id) {    
                Intent startIntent = new Intent(OrderActivity.this, DishInfoActivity.class);
                startIntent.putExtra(DishInfoActivity.ARG_DISH_ID, dish.get(position).id);
                startActivity(startIntent);
            }
        });
И сам pojo:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class Dish {
 
    public Long _id;
    public String id;
    public String id_menu;
    public String id_sub_menu;
    public String name;
    public String image_url_large;
    public String image_url_small;
    public String price;
    public String composition;
    public String weight;
    public String likes;
    public String dislikes;
    public String date_update;
    
    private transient int count;
 
    public int getCount() {
        return count;
    }
 
    public void setCount(int count) {
        this.count = count;
    }
 
}
0
Slon747
59 / 37 / 2
Регистрация: 24.08.2013
Сообщений: 545
03.10.2013, 19:56  [ТС] 3
Спасибо за пример. Но в нем я не смог разобраться.
Пытаюсь сделать свой адаптер, но не получается. Подскажите пожалуйста как дописать его.
Layout содержит ImageView и TextView.
Хочу выводить содержимое таблицы БД в виде списка.

activity_main.xml:

XML
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content" >
 
    <ImageView
        android:id="@+id/icon"
        android:layout_width="22px"
        android:layout_height="22px"
        android:layout_marginLeft="4px"
        android:layout_marginRight="10px"
        android:layout_marginTop="4px"
        android:src="@drawable/ic_launcher" >
    </ImageView>
 
    <TextView
        android:id="@+id/label"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@+id/label"
        android:textSize="20px" >
    </TextView>
 
</LinearLayout>

Передаю в адаптер курсор:
Java
1
2
3
Cursor cursor = database.rawQuery("SELECT _Id, Name FROM products", null);      
MyListAdapter adapter = new MyListAdapter(this, cursor);
setListAdapter(adapter);

Сам класс MyListAdapter:
Java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
public class MyListAdapter extends BaseAdapter {
 
    private List<String> _list = new ArrayList<String>();
    private Context context;
 
    public MyListAdapter(Context context, Cursor data) {
        this.context = context;
        
        //как обработать выборку курсора?
    }
 
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) context
                .getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View rowView = inflater.inflate(R.layout.activity_main, parent, false);
        ImageView imageView = (ImageView) rowView.findViewById(R.id.icon);
        TextView label = (TextView) rowView.findViewById(R.id.label);
        
        imageView.setImageResource(R.drawable.no);
        label.setText(""); //откуда брать данные?
        return rowView;
    }
 
     @Override
     public int getCount() {
         return _list.size();
     }
     @Override
     public String getItem(int position) {
         return _list.get(position);
     }
     @Override
     public long getItemId(int position) {
         return getItem(position).hashCode();
     }
}

Но как потом всё это связать я так и не придумал.
Можно перебирать выборку из курсора и заполнять элементы, но мне это не нравится.
Я так понимаю, при использовании SimpleCursorAdapter список заполняется динамически, при обновлении экрана, а не полным перебором результата запроса.
Подскажите пожалуйста, как мне это использовать?
0
Netscape
374 / 361 / 52
Регистрация: 02.10.2009
Сообщений: 712
Записей в блоге: 4
03.10.2013, 20:07 4
Есть же куча примеров по использованию SimpleCursorAdapter.
http://www.startofandroid.com/ru/uro...lzovanija.html

Можете свой написать.
http://blog.cluepusher.dk/2009/11/16...r-for-android/
1
Slon747
59 / 37 / 2
Регистрация: 24.08.2013
Сообщений: 545
03.10.2013, 22:36  [ТС] 5
Цитата Сообщение от Netscape Посмотреть сообщение
Есть же куча примеров по использованию SimpleCursorAdapter.
http://www.startofandroid.com/ru/uro...lzovanija.html
Спасибо!
Оказалось всё элементарно.
Разгадка была во втором параметре: SimpleCursorAdapter(this, R.layout.item, cursor, from, to);
И теперь мне понятно почему.
0
03.10.2013, 22:36
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2013, 22:36

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Кастомизация SeekBar?
Добрый день! нужно кастомизировать seekbar, знаю (видел) много примеров, но как сделать...

Кастомизация Spinner
Пытаюсь изменить внешний вид spinner Сделал для него стиль вида &lt;style name=&quot;spinner&quot;&gt; ...

Кастомизация прогресс-бара
Добрый день. Каким образом засунуть в прогресс, вместо колора изображение? Код прилагаю:...

Кастомизация табов в actionbar
необходимо чтобы табы выглядели примерно как на приложенном фото, как это можно сделать


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.