【问题标题】:How to combine two vars in android listview: first left-justified and second right-justified如何在android listview中组合两个变量:第一个左对齐和第二个右对齐
【发布时间】:2014-12-16 21:56:27
【问题描述】:

我使用标准的 ListView 和 Adapter 作为 ArrayAdapter 适配器 = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, itemList)。

列表结构如下: LOOOOOOOOOOOONG 项目名称 1

短项目名称 2

我需要在 text1 行中添加数量。我可以将它与 ITEM NAME 连接起来,所以它看起来像

LOOOOOOOOOOOONG 项目名称 1 845

短项目名称2 132

如何将数量向右推,使它们全部对齐并右对齐?有人可以帮忙吗?

【问题讨论】:

    标签: android listview


    【解决方案1】:

    您必须使用自定义适配器,为每个单元格扩展自定义复合视图。

    在一个新的 CustomAdapter.java 中(Item 是你的数据 POJO:见下文)

    public class CustomAdapter extends BaseAdapter {
        private final Context mContext;
        private final List<Item> mItemList;
    
        public CustomAdapter(Context context, List<Item> itemList) {
            mContext = context;
            mItemList = itemList;
        }
    
        @Override
        public int getCount() {
            return mItemList.size();
        }
    
        @Override
        public Item getItem(int position) {
            return mItemList.get(position);
        }
    
        @Override
        public long getItemId(int position) {
            return position;
        }
    
        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            CustomViewHolder holder;
            if (convertView == null) {
                convertView = LayoutInflater.from(mContext).inflate(R.layout.custom_cell, parent, false);
                CustomViewHolder holder = new CustomViewHolder();
                holder.itemNameTextView = (TextView) convertView.findViewById(R.id.textview_item_name);
                holder.itemQuantityTextView = (TextView) convertView.findViewById(R.id.textview_item_quantity);
                convertView.setTag(holder);
            } else {
                holder = (CustomViewHolder) convertView.getTag();
            }
            Item item = getItem(position);
            holder.itemNameTextView.setText(item.getName());
            holder.itemQuantityTextView.setText(item.getQuantity());
            return convertView;
        }
    
        private static class CustomViewHolder {
            public TextView itemNameTextView;
            public TextView itemQuantityTextView;
        }
    }
    

    custom_cell.xml 是:

    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center_vertical"
        android:paddingStart="?android:attr/listPreferredItemPaddingStart"
        android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
        android:minHeight="?android:attr/listPreferredItemHeightSmall">
    
        <TextView
            android:id="@+id/textview_item_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_toLeftOf="@+id/textview_item_quantity"
            android:singleLine="true"/>
    
        <TextView
            android:id="@+id/textview_item_quantity"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"/>
    </RelativeLayout>
    

    这是项目 POJO:

    public class Item {
        private final String mName;
        private final String mQuantity;
    
        public Item(String itemName, String itemQuantity) {
            mName = itemName;
            mQuantity = itemQuantity;
        }
    
        public String getName() {
            return mName;
        }
    
        public String getQuantity() {
            return mQuantity;
        }
    }
    

    将它与您的 ListView 一起使用:

    listView.setAdapater(new CustomAdapter(this, itemList));
    

    【讨论】:

    • 我正在尝试实现这一点,谢谢。我有两个问题:1.Error:(13, 8) 错误:CustomAdapter 不是抽象的,并且不会覆盖 Adapter 中的抽象方法 getItemId(int) 和 2.Error:(43, 40) 错误:不兼容的类型:对象不能转换为 CustomViewHolder(对于 holder=convertView.getTag())。有什么建议吗?
    • 我在没有IDE的情况下编写了代码,对错误深表歉意。您必须为第一个错误实现一个虚拟的 getItemId() 方法,并且必须为第二个错误显式地将标签转换为 CustomViewHolder。查看更新的答案。
    • 谢谢!完全按照我的需要工作!
    【解决方案2】:

    在这一行:

    ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_list_item_1, android.R.id.text1, itemList)
    

    在 res/layout 中创建一个新的自定义 xml 文件 [比如称为 your_layout_name.xml],并将上面代码中的 android.R.layout.simple_list_item_1 替换为“R.layout.your_layout_name”。在该文件中,输入以下代码:

    <?xml version="1.0" encoding="utf-8"?>
    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical|right"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />
    

    说明

    Here 是原始的 android.R.layout.simple_list_item_1 布局,在该 ArrayAdapter 代码中,它定义了行的布局:

    <TextView xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@android:id/text1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:textAppearance="?android:attr/textAppearanceListItemSmall"
    android:gravity="center_vertical"
    android:paddingStart="?android:attr/listPreferredItemPaddingStart"
    android:paddingEnd="?android:attr/listPreferredItemPaddingEnd"
    android:minHeight="?android:attr/listPreferredItemHeightSmall" />
    

    所有需要更改的只是“重力”参数。这定义了文本的对齐方式,您只需添加“正确”即可。

    注意:重力参数通常会在任何视图中对齐其所有内容。比如说,对于 LinearLayout,这将尝试对齐其所有子元素。对于 TextView,它会对齐其文本。

    【讨论】:

    • 对不起,这对我不起作用。它所做的一切使整个字符串“ITEM NAME 825”右对齐。我需要的是使“ITEM NAME”左对齐和“825”右对齐。对不起,如果我不清楚。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-24
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多