【问题标题】:listview vertical height is not coming properlylistview 垂直高度不正确
【发布时间】:2017-08-13 06:55:40
【问题描述】:

我正在开发一个处理联系人的应用程序。我需要一个自定义活动来打开联系人列表中的联系人,该活动应显示所有详细信息。

在这里,我需要显示一个标签为“移动”/“工作”/“家庭”和相应的数字。

预期格式:-

我的问题是,Listview 高度不正确。我在 xml 中尝试了下面的代码。

open_contact.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffff">

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:orientation="vertical"
        android:gravity="center">

        <ImageView
            android:id="@+id/imgView_open_contact"
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:layout_gravity="center_vertical|center_horizontal"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="8dp"

            />
        </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="vertical"
        android:gravity="center">

        <TextView
            android:id="@+id/txtView_name_open_contact"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textColor="#0d0d0d"
            android:maxLines="1"
            />

        <TextView
            android:id="@+id/txtView_company_open_contact"
            android:layout_width="wrap_content"
            android:layout_height="20dp"
            android:textSize="15sp"
            android:maxLines="1"
            android:orientation="vertical"
            android:textColor="#403f3f"/>

    </LinearLayout>

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical">

        <ListView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:id="@+id/listView_showAllNumbers"
            android:background="#ffff"
            android:scrollbars="horizontal"/>

        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="30pt"
            android:orientation="vertical">

            <TextView
                android:layout_width="match_parent"
                android:layout_height="15pt"
                android:layout_marginStart="16dp"
                android:textColor="#0e0e0e"
                android:textStyle="bold"
                android:id="@+id/txtView_label"/>

            <TextView
                android:layout_width="match_parent"
                android:layout_height="15pt"
                android:layout_marginStart="16dp"
                android:textColor="#1d34c9"
                android:orientation="vertical"
                android:id="@+id/txtView_label_value"/>

        </LinearLayout>


    </LinearLayout>

</LinearLayout>

填充数据的相关java代码

openContactActivity.java

…………

@Override
protected void onPostExecute(String r) {
    customAdapOpenContact cAdap;

    if(mob_index > 0)
    {
        int i = 0;
        //listOpenContact s = new listOpenContact("Mobile", number_mob[0]);
        listOpenContact s = new listOpenContact("Mobile");
        listItem.add(s);
        cAdap = new customAdapOpenContact(getBaseContext(), listItem);
        list_showAllNumbers.setAdapter(cAdap);
        while(i < mob_index){
            Log.e("DEBUG: ", "NUMBER: " + number_mob[i]);
            listOpenContact n = new listOpenContact(number_mob[i]);
            listItem.add(n);
            cAdap = new customAdapOpenContact(getApplicationContext(), listItem);
            list_showAllNumbers.setAdapter(cAdap);
            i++;
        }
    }

.......

listOpenContact.java

public class listOpenContact {

    String label;
//    String label_content;
    //Constructor for Single row
    listOpenContact (String label) {
        this.label = label;
        //this.label_content = label_content;
    }
}

customAdapOpenContact.java

public class customAdapOpenContact extends BaseAdapter {

    private Context c;
    private ArrayList<listOpenContact> list;


    customAdapOpenContact(Context context, ArrayList<listOpenContact> list){
        c = context;
        this.list = list;
    }

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

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

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

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        LayoutInflater inflater = (LayoutInflater) c.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        View row =  inflater.inflate(R.layout.open_contact, null, false);

        TextView label   = (TextView) row.findViewById(R.id.txtView_label);
        TextView label_content = (TextView) row.findViewById(R.id.txtView_label_value);

        listOpenContact listOpenContact = list.get(position);
    if(listOpenContact.label == "Mobile" || listOpenContact.label == "Work" || listOpenContact.label == "Home")
        label.setText(listOpenContact.label);
    else
        label_content.setText(listOpenContact.label);

        Log.e("DEBUG: ", "Size: " + listOpenContact.label.length());

        return row;
    }
}

输出如下:

有人可以帮我弄清楚我的 xml 有什么问题吗?或者请建议新代码以获得预期的布局(列表视图部分)

【问题讨论】:

  • 添加完整的列表项布局。
  • @MuthukrishnanRajendran:添加了完整的 xml 代码
  • 能否添加相关的java代码
  • @MuthukrishnanRajendran:添加了 java 代码
  • 我看到你使用主布局作为行项目布局。你有2个选择。正确设置未使用项目的可见性或为 listviewShowAllNumbers 使用另一个行项目 xml

标签: android xml android-layout listview


【解决方案1】:

然后主要问题是您为您的活动和列表项提供了单一布局,并且您为每个项目提供了尺寸并且您没有设置默认值,因此在您的适配器中它会尝试创建您的视图并且它只会设置手机号码部分,所以剩下的项目是空的,所以它看起来像空的空间。

要检查这一点,请尝试在您的布局中赋予一些价值,它将出现在每个项目中,以实现您应该为您的活动和列表项创建 2 个单独的布局,如下所示

  1. 检查open_contact 的根布局,如果它没有将wrap_content 更改为android:layout_height="wrap_content"

  2. 您正在将适配器添加到如下所示的循环更改中,

将适配器添加到循环外列表

@Override
protected void onPostExecute(String r) {
    customAdapOpenContact cAdap;

    if(mob_index > 0) {
        int i = 0;
        listOpenContact s = new listOpenContact("Mobile");
        listItem.add(s);

        while(i < mob_index){
            Log.e("DEBUG: ", "NUMBER: " + number_mob[i]);
            listOpenContact n = new listOpenContact(number_mob[i]);
            listItem.add(n);

            i++;
        }
        cAdap = new customAdapOpenContact(getBaseContext(), listItem);
        list_showAllNumbers.setAdapter(cAdap);
    }
}

新建布局 list_item.xml

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

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:textColor="#0e0e0e"
        android:textStyle="bold"
        android:id="@+id/txtView_label"/>

    <TextView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_marginStart="16dp"
        android:textColor="#1d34c9"
        android:orientation="vertical"
        android:id="@+id/txtView_label_value"/>
</LinearLayout>

将此布局提供给您的适配器

View row =  inflater.inflate(R.layout.list_item, null, false);

然后像下面这样改变你的活动布局,

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

    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="120dp"
        android:orientation="vertical"
        android:gravity="center">

        <ImageView
            android:id="@+id/imgView_open_contact"
            android:layout_width="90dp"
            android:layout_height="90dp"
            android:layout_gravity="center_vertical|center_horizontal"
            android:layout_marginTop="20dp"
            android:layout_marginBottom="8dp"

            />
    </LinearLayout>
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:orientation="vertical"
        android:gravity="center">

        <TextView
            android:id="@+id/txtView_name_open_contact"
            android:layout_width="wrap_content"
            android:layout_height="30dp"
            android:textSize="20sp"
            android:textStyle="bold"
            android:textColor="#0d0d0d"
            android:maxLines="1"
            />

        <TextView
            android:id="@+id/txtView_company_open_contact"
            android:layout_width="wrap_content"
            android:layout_height="20dp"
            android:textSize="15sp"
            android:maxLines="1"
            android:orientation="vertical"
            android:textColor="#403f3f"/>

    </LinearLayout>

    <ListView
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView_showAllNumbers"
        android:background="#ffff"
        android:scrollbars="horizontal"/>

</LinearLayout>

【讨论】:

  • 加你open_contact.xml
  • 这是有问题的,我已将它的根标签高度更新为 wrap_content
  • 您的活动和列表项是否使用单一布局..?
  • 是的.. 它应该显示联系人图像、姓名以及下面的列表视图,其中包含电话号码
  • @Msn,我在回答中解释了,看看。
【解决方案2】:

在你的布局结构中,你的根布局有:

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
   android:layout_height="match_parent"
   android:background="#ffff">

在这里,您将高度创建为match_parent。这就是为什么您的每个项目都显示为这样的原因。更改高度wrap_content

【讨论】:

    【解决方案3】:

    尝试删除 TextView s android:id="@+id/txtView_name_open_contact"android:id="@+id/txtView_company_open_contact"wrap_content 的高度(您可以使用 padding_toppadding_bottomtextViews 周围的一些空间,也删除 @ 的方向987654328@TextView

    【讨论】:

    • 就像接受的答案一样,您需要为列表项创建单独的布局并设置列表视图的高度以包装内容。
    猜你喜欢
    • 2018-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-02
    • 2014-07-21
    相关资源
    最近更新 更多