Форум программистов, компьютерный форум, киберфорум
Наши страницы
Программирование Android
Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
swed
0 / 0 / 1
Регистрация: 06.06.2011
Сообщений: 12
#1

Отображение кастомных виджетов в ListView - Программирование Android

28.09.2011, 21:55. Просмотров 1424. Ответов 0
Метки нет (Все метки)

Здравствуйте! Недавно столкнулся со следующей задачей - есть полностью кастомный виджет, унаследованный от View, отрисовывается он в методе onDraw и мне необходимо сделать список из таких виджетов в виде ListView. Для этого я переопределяю класс BaseAdapter специально для этого виджета и применяю этот мой custom adapter к виджету списка, но мой кастомный виджет просто не рисуется в списке, вместо него - просто черная полоска шириной один пиксель. Вопрос - что я делаю не так? Заранее спасибо!

http://www.cyberforum.ru/android-dev/thread936905.html
Класс, описывающий адаптер:
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
public class PBarList extends BaseAdapter{
    private Context mContext = null;
    private ArrayList<String> Vlist = null;
    
    public PBarList(Context context, ArrayList<String> list)
    {
        mContext = context;
        Vlist = list;
    }
 
    @Override
    public int getCount() {
        
        return Vlist.size();
    }
 
    @Override
    public Object getItem(int position) {
        
        return Vlist.get(position);
    }
 
    @Override
    public long getItemId(int position) {
        
        return position;
    }
 
    private View newView(Context context, ViewGroup parent)
    {
        LayoutInflater inflater = LayoutInflater.from(context);
        return inflater.inflate(R.layout.pbar_layout, null);
    }
    
    private void bindView(int position, View view)
    {
        ECProgBar progressBar = (ECProgBar)view.findViewById(R.id.eCProgBar1);
        String array = Vlist.get(position);
        progressBar.setText(array, "");
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) 
    {
        View view = null;
        if(convertView != null) view = convertView;
        else view = newView(mContext, parent);
        bindView(position, view);
        return view;
    }
}
Виджет:
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
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
public class ECProgBar extends View{
 
    private String primaryText;
    private String secondaryText;
    private Paint paint;
    private int pos;
    private int max;
 
    private int background;
    private int foreground;
    private int textColor;
    private int tR, tG;
    
    
    public ECProgBar(Context context) {
        super(context);
        initProgressBar();
    }
    
    public ECProgBar(Context context, AttributeSet attrs){
        super(context, attrs);
        initProgressBar();
    }
    
    protected void onMeasure(int widthSpec, int heightSpec){
        setMeasuredDimension(MeasureWidth(widthSpec), MeasureHeight(heightSpec));
    }
    
    private int MeasureHeight(int heightSpec) {
        int specSize = MeasureSpec.getSize(heightSpec);
        int specMode = MeasureSpec.getMode(heightSpec);
        int result = 0;
        switch(specMode)
        {
        case MeasureSpec.AT_MOST:     //wrap content
            result = 70;
            break;
        case MeasureSpec.EXACTLY:     //fill parent
            result = specSize;
            break;
        }
        
        return result;
    }
 
    private int MeasureWidth(int widthSpec) {
        int specSize = MeasureSpec.getSize(widthSpec);
        int specMode = MeasureSpec.getMode(widthSpec);
        int result = 0;
        if(specMode == MeasureSpec.AT_MOST || specMode == MeasureSpec.UNSPECIFIED)
            result = specSize;
        else if(specMode == MeasureSpec.EXACTLY)
            result = specSize;
        return result;
    }
 
    private void initProgressBar(){
        paint = new Paint();
        max = 90;
        pos = 0;
        background = 0xFFEEEEEE;
        foreground = 0xFF00BADA;
        tR = 0;
        tG = 255;
        textColor = 0xFF111111;
        primaryText = "";
        secondaryText = "";
    }
    
    protected void onDraw(Canvas canvas){
        canvas.drawColor(background);
        paint.setColor(foreground);
        paint.setAntiAlias(true);
        paint.setTextSize(27);
        int curPos = (int) ((double)pos / (double)(max) * getWidth());
        int percent = (int)(((double)pos / (double)max) * 100.0);
        if(percent > 50) tG = 255 - (2 * ((((percent) - 50) * 255) / 100));
        else tR = 2 * (( percent * 255) / 100);
        paint.setColor(Color.rgb(tR, tG, 0));
        
        canvas.drawRect(0, 0, curPos, getHeight(), paint);
        
        paint.setColor(textColor);
        if(paint.measureText(primaryText) > getWidth() - 5)
        {
            String op = "";
            int i = 0;
            while(paint.measureText(op) < getWidth() - 30)
            {
                op += primaryText.charAt(i);
                i++;
            }
            op += "..";
            canvas.drawText(op, 3, (getHeight() / 2) - 5, paint);
        }
        else canvas.drawText(primaryText, 3, (getHeight() / 2) - 5, paint);
 
        paint.setTextSize(18);
        canvas.drawText(secondaryText, 3, (getHeight()/2) + 20, paint);
        
        paint.setColor(Color.rgb(200, 200, 200));
        canvas.drawLine(0, 1, getWidth(), 1, paint);
        paint.setColor(Color.rgb(100, 100, 100));
        canvas.drawLine(0, getHeight()-1, getWidth(), getHeight()-1, paint);
 
        if(pos == 90)
        {
            tR = 0;
            tG = 255;
        }
    }
    
    public void setPos(int position){
        pos = position;
    }
    
    public int getPos(){
        return pos;
    }
    
    public void setText(String primText, String secText){
        primaryText = primText;
        secondaryText = secText;
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2011, 21:55
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Отображение кастомных виджетов в ListView (Программирование Android):

Отображение ListView во фрагменте
Привет, всем! Буду очень признательна, если кто-нибудь сможет мне помочь...

Отображение записи ListView
Делаю приложение для заметок. Заметки сохраняются в файле. Механизм открытия...

ListView изменить отображение строк
Есть listView в него выводится массив String колличество символов в отлельных...

Неправильное отображение Listview создаваемого с SimpleAdapter
Никак не получается сделать отображение таким как на картинке ...

ListView. После добавления кнопки перестал быть доступен сам ListView
Кастомизировал ListView с помощью нескольких TextView. Но после того, как...

0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.09.2011, 21:55
Привет! Вот еще темы с решениями:

Listview вывод данных и переход по нажатию на другой Listview SQLite
Доброго извините за название темы, долго не мог сформировать название, В общем...

Передача данных из ListView в другой Activity в ListView
Добрый день. Пытаюсь разобраться с передачей данных с ListView, но выходит что...

Данные из SQlite в ListView, обработка события ListView
Ребят, есть БД, ListView. Надо при нажатии на строчку ListView вытащить данные...

Размеры виджетов
Всем привет, столкнулся со следующей проблемой. Необходимо сделать так, чтоб...


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

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

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