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

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

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

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

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

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

Класс, описывающий адаптер:
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;
    }
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.09.2011, 21:55     Отображение кастомных виджетов в ListView
Посмотрите здесь:
отображение Listview Android
Отображение записи ListView Android
Отображение ListView во фрагменте Android
ListView изменить отображение строк Android
Неправильное отображение Listview создаваемого с SimpleAdapter Android
Размеры виджетов Android
Не работают методы виджетов Android
Android Виджет не появляется в списке виджетов
Android На телефоне виджет не появляется в списке виджетов
C++ Qt Отображение нескольких виджетов
Отображение нескольких виджетов в QListView C++ Qt
Отображение в ListView C#

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Ответ Создать тему
Опции темы

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