Android: ListView, проблема с закругленными углами - PullRequest
3 голосов
/ 11 июля 2011

У меня ListView с закругленными углами, реализованными как ниже.

<ListView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/list"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:background="@drawable/list_bg"
    android:divider="#dbdbdb"
    android:dividerHeight="1sp"
    android:cacheColorHint="#00000000"
    android:descendantFocusability="afterDescendants"
    android:scrollbars="vertical">
</ListView>

, где list_bg.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <solid android:color="#ffffff"/>
    <corners android:bottomLeftRadius="10dp"
            android:bottomRightRadius="10dp" 
            android:topLeftRadius="10dp"
            android:topRightRadius="10dp"
            />
</shape>

Это дает мне закругленные углы.Проблема в том, что каждый элемент имеет RelativeLayout с TextView на левой стороне и ImageButton на правой стороне.Оба вида имеют пользовательскую графику в нажатом, выключенном состоянии и состоянии по умолчанию.Примерно так.

+------------------------------------+
|      TextView        | ImageButton |
+------------------------------------+

Проблема в том, что пользовательский графический элемент покрывает фон ListView и, следовательно, закругленные углы на первом и последнем элементе.Все в порядке при прокрутке.

Я написал собственный адаптер и в методе getView я установил правильный bg для элементов.

@Override
public View getView(int position, View view, ViewGroup parent) {        
    ...
    if(position == 0) {
        mItemView.setBackgroundResource(R.drawable.cell_item_first_selector);
        mImgBtn.setBackgroundResource(R.drawable.cell_btn_first_selector);
    }
    else if (position == mData.size() -1) {
        mItemView.setBackgroundResource(R.drawable.cell_item_last_selector);
        mImgBtn.setBackgroundResource(R.drawable.cell_btn_last_selector);
    } 
    else {
        mItemView.setBackgroundResource(R.drawable.cell_item_def_selector);
        mImgBtn.setBackgroundResource(R.drawable.cell_btn_def_selector);
    }
    ... 
}

Это работает, но я не уверен, что это хорошорешение.Есть ли другой способ автоматически закруглять углы в представлениях Android, кроме установки фона?

Ответы [ 2 ]

2 голосов
/ 28 ноября 2012
public class ClippedListView extends ListView {

/**
 * @param context
 */
public ClippedListView(Context context) {
    super(context);
}

/**
 * @param context
 * @param attrs
 */
public ClippedListView(Context context, AttributeSet attrs) {
    super(context, attrs);
}

@Override
protected void dispatchDraw(Canvas canvas) {
    float radius = 10.0f;
    Path clipPath = new Path();
    RectF rect = new RectF(0, 0, this.getWidth(), this.getHeight());
    clipPath.addRoundRect(rect, radius, radius, Path.Direction.CW);
    canvas.clipPath(clipPath);
    super.dispatchDraw(canvas);
}
}

Сначала отсечение не работало, затем с помощью

setLayerType (View.LAYER_TYPE_SOFTWARE, null)

в моем clippedListView решить проблему. Фон моих предметов больше не мешает моим углам!

0 голосов
/ 11 июля 2011

Ну, если вам нужен этот фон для элементов в списке, вы должны прикрепить фон к макету элемента, а не к представлению списка.

...