【问题标题】:Android: ListView, problem with rounded cornersAndroid:ListView,圆角问题
【发布时间】:2011-07-11 07:44:39
【问题描述】:

我的 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 视图中自动圆角,而不仅仅是设置背景?

【问题讨论】:

    标签: android listview rounded-corners


    【解决方案1】:
    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 上解决了这个问题。我的物品的背景不再弄乱我的角落了!

    【讨论】:

    • 出色的解决方案。拯救了我的一天。您知道如何在没有 SetLayerType(需要 API 11)的情况下实现这一点吗?
    【解决方案2】:

    好吧,如果列表中的项目需要此背景,则应将背景附加到项目布局,而不是列表视图。

    【讨论】:

    • 没用。仍然是第一个和最后一个项目图形隐藏圆角。是否只有为第一项和最后一项设置不同图形的解决方案?
    • 嗯,它应该工作。您可以为您的项目发布更多布局代码吗?
    猜你喜欢
    • 2012-11-22
    • 2011-01-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-16
    • 1970-01-01
    • 2013-06-27
    相关资源
    最近更新 更多