2016-11-21 128 views
1

我想有一个列表视图的外观这些行:如何自定义列表视图行

  • 有圆角;
  • 部分着色(每行的左侧部分);
  • 在它们的着色区域中包含另一种颜色的形状。

下面是从其他应用程序的例子:

piano tiles 2

我现在有两条引线,但我没有对任何人的成功。

我的第一引线(形状)

我发现了如何通过使用形状来获得圆角,并用它作为列表视图的背景。

的绘制形状文件“rounded_rectangle.xml”:

<?xml version="1.0" encoding="utf-8"?> 
<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle"> 

    <corners 
     android:bottomRightRadius="7dp" 
     android:bottomLeftRadius="7dp" 
     android:topLeftRadius="7dp" 
     android:topRightRadius="7dp"/> 

</shape> 

活动文件:

<?xml version="1.0" encoding="utf-8"?> 
<FrameLayout  xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:custom="http://schemas.android.com/apk/res-auto" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    app:layout_behavior="@string/appbar_scrolling_view_behavior" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    // ... 
    <ListView 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_above="@+id/splitView" 
     android:id="@+id/lv_player" 
     android:layout_alignParentTop="true" 
     android:background="@drawable/rounded_rectangle"/> 

    // ... 

</FrameLayout> 

不过,我不知道如何使用的形状有一排部分着色或画一个图标。我可以用一种颜色填充形状,但这些行是完全着色的。

我的第二引线(矢量)

我还发现,我可以用一个向量作为我的列表视图的背景。好处是我可以使用路径绘制任何我想要的东西。

矢量文件的一个例子:

<vector xmlns:android="http://schemas.android.com/apk/res/android" 
    android:height="64dp" 
    android:width="64dp" 
    android:viewportHeight="600" 
    android:viewportWidth="600" > 

    <path 
     android:name="w" 
     android:fillColor="#000000" 
     android:pathData="m 290,103 l-200,0 c -50,0 -50,-100 0,-100 l200,0 z" 
    /> 
</vector> 

我可以轻松地创建为我行的彩色区域,另一个用于图标的路径。但是,现在的问题是我不知道如何将矢量的大小缩放到线的大小。

你知道什么是最好的选择,我如何获得预期的结果?

在此先感谢。

回答

1

所有你需要单独创建你看中的项目就像XML布局包含自定义项的描述首先:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:orientation="horizontal"> 

<TextView 
    android:id="@+id/optionName" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="10dp" 
    android:layout_marginStart="10dp" 
    android:layout_weight="10" 
    android:fontFamily="sans-serif-medium" 
    android:text="@string/option" 
    android:textAppearance="?android:attr/textAppearanceMedium" 
    android:textColor="@android:color/white" 
    android:textStyle="bold" /> 

<CheckBox 
    android:id="@+id/activated" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:layout_weight="1" 
    android:gravity="center" /> 

不是创建您的适配器,这将使你的名单有你的布局作为项

公共类ListOptionsAdapter延伸BaseAdapter {

List<OptionsObject> Features = new ArrayList<OptionsObject>(); 
LayoutInflater inflater; 
Context context; 

public ListOptionsAdapter(List<OptionsObject> features, Context context) { 
    super(); 
    Features = features; 
    inflater = LayoutInflater.from(context); 
    this.context = context; 
} 

@Override 
public int getCount() { 
    return Features.size(); 
} 

@Override 
public OptionsObject getItem(int position) { 
    return Features.get(position); 
} 

@Override 
public long getItemId(int position) { 
    return position; 
} 

@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 

    ViewHolder holder; 

    if (convertView == null) { 
     convertView = inflater.inflate(R.layout.item_list_view, parent, false); 
     holder = new ViewHolder(); 
     holder.optionName = (TextView) convertView.findViewById(R.id.optionName); 
     holder.isActivate = (CheckBox) convertView.findViewById(R.id.activated); 
     convertView.setTag(holder); 

    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 

    return convertView; 
} 

static class ViewHolder { 
    TextView optionName; 
    CheckBox isActivate; 
} 

}

之后如上我所指定的布局,我将如方法getView(项目使用的名称)和每个元素影响到视图支架

NB:在getView你必须为元素指定的值,它们将被显示或留空如果u不需要

之后,仅仅在我的活动课我打电话给我的ListView

和我的适配器

OptionList = (ListView) findViewById(R.id.optionList); 
adapter = new ListOptionsAdapter(Features, getApplicationContext(), this); 
OptionList.setAdapter(adapter);