Форум программистов, компьютерный форум CyberForum.ru

Программирование Android

Войти
Регистрация
Восстановить пароль
 
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 423
#1

Кастомизация списков - Программирование Android

02.10.2013, 17:15. Просмотров 1070. Ответов 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 для хранения в списке "Ключ-Значение".

Вопрос, можно ли такое осуществить или придется получать выборку из БД и в цикле заполнять список, при этом параллельно заполняя массив, в котором будет храниться связь между позицией элемента в списке и его идентификатором в БД?
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
02.10.2013, 17:15
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Кастомизация списков (Программирование Android):

Кастомизация Spinner - Программирование Android
Пытаюсь изменить внешний вид spinner Сделал для него стиль вида <style name="spinner"> <item...

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

Кастомизация ListView - Программирование Android
http://imglink.ru/pictures/15-06-14/3d97212a44f93f016eb14cfbf868d023.jpg Как реализовать кастомизацию списка, как в офф приложении...

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

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

Кастомизация заголовока окна - Программирование Android
Лайауты имеют белый фон и тему по-умолчанию. На версии 4.1 заголовки окон не отделены визуально от самих окон и текст в них плохо виден. ...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Netscape
371 / 358 / 48
Регистрация: 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;
    }
 
}
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 423
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 список заполняется динамически, при обновлении экрана, а не полным перебором результата запроса.
Подскажите пожалуйста, как мне это использовать?
Netscape
371 / 358 / 48
Регистрация: 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/
Slon747
59 / 37 / 1
Регистрация: 24.08.2013
Сообщений: 423
03.10.2013, 22:36  [ТС] #5
Цитата Сообщение от Netscape Посмотреть сообщение
Есть же куча примеров по использованию SimpleCursorAdapter.
http://www.startofandroid.com/ru/uro...lzovanija.html
Спасибо!
Оказалось всё элементарно.
Разгадка была во втором параметре: SimpleCursorAdapter(this, R.layout.item, cursor, from, to);
И теперь мне понятно почему.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.10.2013, 22:36
Привет! Вот еще темы с ответами:

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

Кастомизация ListView и использование Sticky Header - Программирование Android
Использую библиотеку https://github.com/beworker/pinned-section-listview И столкнулся с вопросом по незнанию Там есть пример, делал на...

Кастомизация стандартных вьювов - плагиат или нет? - Программирование Android
Вопрос совершенно не относящийся к программированию, но вроде уместный для данной ветки. Допусти есть стандартный вьюв Holo Light, он меня...

Несколько списков в приложении - Программирование Android
Доброго времени суток. Сейчас нужно реализовать несколько списков (Например, первый список - это список имен, и к каждому необходимо...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
03.10.2013, 22:36
Ответ Создать тему
Опции темы

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