列表视图的弯曲边框

时间:2011-05-03 14:40:47

标签: android

我是android和java的新手,我需要在android中创建一个简单的应用程序。我在此活动中有一个活动页面。这是我的活动页面

package com.tkcmu.dev;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.net.URL;
import java.net.URLConnection;
import java.util.ArrayList;

import org.apache.http.client.ClientProtocolException;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class tkcmu extends Activity {
    private ListView lv1;

    @Override
        public void onCreate(Bundle icicle)
        {
        super.onCreate(icicle);
        setContentView(R.layout.main);


        ArrayList<String> listItems = new ArrayList<String>();

        try {
            URL recentUrl = new URL(
                    "To some link");
            URLConnection tc = recentUrl.openConnection();
            BufferedReader in = new BufferedReader(new InputStreamReader(tc.getInputStream()));

            String line;
            while ((line = in.readLine()) != null) {
                JSONArray ja = new JSONArray(line);

                for (int i = 0; i < ja.length(); i++) {
                    JSONObject jo = (JSONObject) ja.get(i);
                    listItems.add(jo.getString("content"));
                }
            }

    }catch (ClientProtocolException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }catch (IOException e) {
                e.printStackTrace();

            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }


        lv1=(ListView)findViewById(R.id.ListView01);
        // By using setAdpater method in listview we an add string array in list.
        lv1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , listItems));
        }
}

我的main.xml是这样的:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/LinearLayout01"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content">

    <ListView
        android:id="@+id/ListView01"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginLeft="10sp"
        android:layout_marginRight="10sp"
        android:layout_marginTop="10sp"
        android:layout_weight="1"
        android:background="@drawable/customshape"
        android:cacheColorHint="#FFFFFF"
        android:clickable="true"
        android:clipToPadding="true"
        android:dividerHeight="1px"
        android:drawSelectorOnTop="false"
        android:focusable="true"
        android:focusableInTouchMode="true"
        android:footerDividersEnabled="true"
        android:headerDividersEnabled="true"
        android:longClickable="true" />
</LinearLayout>

并且我在drawable中有customshape.xml,这是

 <shape xmlns:android="http://schemas.android.com/apk/res/android">
    <corners android:radius="10dp" />
</shape>

我得到了结果,整个自定义列表部分变得弯曲,但我希望每行都有一个弯曲的背景。我在这里发布了我的整个代码(不包括AndroidManifest.xml)所以如果有人告诉我在这段代码中我需要做什么更改,我们将不胜感激。任何机构都知道如何实施它。

7 个答案:

答案 0 :(得分:4)

添加

 android:background="@drawable/customshape" 

到listview row.xml文件的根视图,而不是将其应用于listview

答案 1 :(得分:2)

我从来没有为圆角做过这个,但我会尝试为列表提供自定义适配器。自定义适配器允许您指定每个项目使用哪个视图。在您的情况下,您可以尝试提供带有圆角边框的视图(使用形状XML定义)。

为此,您将替换该行 lv1.setAdapter(new ArrayAdapter<String>(this,android.R.layout.simple_list_item_1 , listItems));

使用BaseAdapter实现getView()方法。

有关于如何执行此操作的数百个教程,但this one似乎更详细。

答案 2 :(得分:1)

在适配器类中使用此布局并使此布局膨胀。在您的项目中导入最新的cardview库。

 <?xml version="1.0" encoding="utf-8"?>
 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">

<android.support.v7.widget.CardView xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="8dp"
    card_view:cardUseCompatPadding="true">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent">

        <RelativeLayout
            android:id="@+id/relative_card_layout"
            android:layout_width="match_parent"
            android:layout_height="wrap_content">

            <ImageView
                android:id="@+id/country_photo"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:contentDescription="@string/action_settings"
                android:scaleType="centerCrop"
                android:src="@drawable/sweden" />

            <TextView
                android:id="@+id/title_name"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_centerInParent="true"
                android:gravity="center"
                android:text="@string/app_name"
                android:textColor="@color/colorAccent"
                android:textSize="24sp"
                android:textStyle="bold" />

        </RelativeLayout>

        <TextView
            android:id="@+id/title_description"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="8dp"
            android:layout_marginStart="8dp"
            android:text="@string/app_name"
            android:layout_below="@+id/relative_card_layout"
            android:textColor="@color/colorAccent"
            android:textSize="18sp"
            android:padding="8dp"
            android:textStyle="bold" />
    </RelativeLayout>

</android.support.v7.widget.CardView>
</LinearLayout>

答案 3 :(得分:1)

我建议您使用自定义适配器,您可以将形状设置为背景。这在那里很容易实现。但既然你是新手,那将会有点困难。所以有些东西我不推荐但可能是一个解决方案:按下android.R.layout.simple_list_item_1上的control + B.这是由Android团队编写的原始列表视图XML。因此,您必须覆盖此设置并在此处设置背景形状(您已编写的形状,将其设置为背景)。

答案 4 :(得分:0)

最简单的方法是定义这样的xml,并将其命名为my_list_item或任何你喜欢的内容:

<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="wrap_content"
   android:background="@drawable/customshape"
   android:layout_height="wrap_content">
</TextView>

并在代码中更改此行:

lv1.setAdapter(new ArrayAdapter<String>(this,R.layout.my_list_item , listItems));
  

重要提示:

     

将颜色设置为customshape drawable的背景。没有定义任何颜色会导致一些旧的Android平板电脑(Axtrom,华硕)黑色背景。像这样:

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

另外需要提及的是,您可以在您创建的xml中更改行的所有内容。例如textcolor,textsize,gravity等....

答案 5 :(得分:0)

创建可绘制的布局

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
   <corners android:radius="5dp"/>
   <solid android:color="#ff0000"/>
</shape>

然后在listView的后台使用它

 android:background="@drawable/yourLayoutName" 

答案 6 :(得分:0)

一种简单的方法是使用CardView。以下是您添加依赖项所需的依赖项:com.android.support:cardview-v7:27.0.2。将其添加到您的build.gradle

接下来,只需浏览到simple_list_item_1.xml,即浏览到您已创建布局的XML文件,以便使用适配器在ListView中显示单行!

在此XML文件中,将CardView设为您的父布局,例如,如果这是simple_list_item_1.xml中的上一个代码:

<RelativeLayout
    android:id="main_layout"
    android:width="match_parent"
    android:height="wrap_content">

    ...
    //Other layouts and normal code here.
    ...

</RelativeLayout>

然后,您应该将代码更改为:

<android.support.v7.widget.CardView
    xmlns:card_view="http://schemas.android.com/apk/res-auto"
    android:id="@+id/card_view"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    card_view:cardCornerRadius="4dp">

    <RelativeLayout
        android:id="main_layout"
        android:width="match_parent"
        android:height="wrap_content">

        ...
        //Other layouts and normal code here.
        ...

    </RelativeLayout>

</android.support.v7.widget.CardView>

在这里,您可以使用CardView的card_view:cardCornerRadius属性为整个布局提供圆形边缘!

P.S。作为额外的好处,您还可以使用card_view:cardElevation属性为您的布局提供凸起的外观,如果您使用此属性,请确保在所有方向留下一些空间以产生明暗效果!< / p>

希望我能提供帮助;)

以下是一些可以帮助您的资源:

1)official documentation.

2)A basic tutorial (with a RecyclerView)

3)也是我方的免责声明:传统上,CardView仅用于RecyclerView's,这必须导致人们普遍认为CardView只能用于一个RecyclerView而没有别的。这是一种常见的误解,CardView是一个设计元素,并且不以任何方式绑定到RecyclerView,它们可以以您想要的任何方式使用!

这是一个四舍五入的CardView的样子(减去ListView,即CardView本身) - 请参阅one of my designs.