Пользовательские виды отображаются только один раз - PullRequest
1 голос
/ 01 июля 2011

Я сделал очень простой customView, серый прямоугольник с произвольным количеством красных отметок внутри прямоугольника, отмеченного процентами.

public class DemoView extends View {
private ShapeDrawable mDrawable;
private ArrayList<ShapeDrawable> mMarks;

public DemoView(Context context, int[] marks) {
    super(context);
    int x = 0;
    int y = 0;
    int width = 100;
    int height = 10;
    // Timeline Initially empty

    mDrawable = new ShapeDrawable(new RectShape());
    mDrawable.getPaint().setColor(Color.GRAY);
    mDrawable.setBounds(x, y, x + width, y + height);
    // Add marks
    if (marks != null && marks.length % 2 == 0) {
        mMarks = new ArrayList<ShapeDrawable>(marks.length / 2);
        ShapeDrawable mark;
        for (int i = 1; i < marks.length; i = i + 2) {
            mark = new ShapeDrawable(new RectShape());
            mark.getPaint().setColor(Color.RED);
            mark.setBounds(x + marks[i - 1], y, x + marks[i], y + height);
            mMarks.add(mark);
        }
    }
}

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas);
    mDrawable.draw(canvas);
    if (mMarks != null)
        for (ShapeDrawable mark : mMarks)
            mark.draw(canvas);
}

}

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

XML:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:id="@+id/llayout"
>
<TextView  
android:layout_width="fill_parent" 
android:layout_height="wrap_content" 
android:text="@string/hello"
/>
</LinearLayout>

Код макета:

public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    LinearLayout ll = (LinearLayout) findViewById(R.id.llayout);
    demoview = new DemoView(this, new int[]{10,15,35,60});
    demoview.setId(ID_NUM++);
    ll.addView(demoview);
    demoview2 = new DemoView(this, new int[]{0,1,3,6});
    demoview2.setId(ID_NUM++);
    ll.addView(demoview2);
    demoview3 = new DemoView(this, new int[]{25,60});
    demoview3.setId(ID_NUM++);
    ll.addView(demoview3);
    demoview4 = new DemoView(this, new int[]{15,60});
    demoview4.setId(ID_NUM++);
    ll.addView(demoview4);

}

Результаты:

Result of linearlayout code above..

Это неправильный путь? Я упускаю какой-то очевидный ключ для использования этого представления несколько раз? Если это неправильный маршрут, есть ли какой-то другой способ сделать собственную фигуру? Возможно расширение rectShape?

Ответы [ 2 ]

1 голос
/ 03 июля 2011

Следуя совету Мибольмы, я посмотрел видео, приведенное выше, видео из Google I / O 2009 об ускорении вашего пользовательского интерфейса.

Эта информация, безусловно, все еще применима два года спустя.Я не только смог ускорить все свои ListViews с помощью ViewHolder, но и смог найти ответ на свой вопрос.

При создании пользовательского представления необходимо переопределить два метода, первый -перечисленные выше: onDraw.

Недостающий метод?onMeasure ().Более подробную информацию можно найти здесь .

1 голос
/ 01 июля 2011

Возможно, вы захотите посмотреть это .

Romain объясняет, как делать там пользовательские представления.

...