0

我正在尝试在我的 listView 中间添加一个按钮。理想情况下,该按钮将拆分 listView,然后它将继续,但如果这不可能,我可以在 listView 的一行内使用一个按钮。例如。我的列表视图将有第一行(图像+文本)、第二行(图像+文本)、按钮,然后继续列表视图。

我写了以下代码。这会在 listView 的一行中添加一个按钮,但同时它也会在我的 listView 中的每一行中添加一个空按钮(带有现在文本的按钮)。此外,中心的重力设置不起作用。

我的 xml

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

     <ImageView android:id="@+id/imgUserIcon"
        android:layout_width="wrap_content"
        android:layout_height="fill_parent"
        android:layout_marginRight="10dp"
        android:layout_marginTop="5dp"
        android:gravity="center_vertical"
        android:scaleType="fitStart" />

     <Button
         android:id="@+id/buttonShowHide"
         android:layout_width="wrap_content"
         android:layout_height="wrap_content"
         android:gravity="center"
         android:text="@string/showHide" />

     <TextView android:id="@+id/txtTitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_marginLeft="10dp" 
                    android:layout_marginTop="5dp"
            />

</LinearLayout>

我的适配器

public class UserAdapter extends ArrayAdapter<UserAccountData> {
    Context context;
    int layoutResourceId;
    User data[] = null;

    public UserAdapter(Context context, int layoutResourceId,
            UserAccountData[] data) {
        super(context, layoutResourceId, data);
        this.layoutResourceId = layoutResourceId;
        this.context = context;
        this.data = data;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        View row = convertView;
        UserAccountDataHolder holder = null;

        if (row == null) {
            LayoutInflater inflater = ((Activity) context).getLayoutInflater();
            row = inflater.inflate(layoutResourceId, parent, false);

            holder = new UserAccountDataHolder();
            holder.imgIcon = (ImageView) row.findViewById(R.id.imgUserIcon);
            holder.txtTitle = (TextView) row.findViewById(R.id.txtTitle);
            holder.showHide = (Button) row.findViewById(R.id.buttonShowHide);


            row.setTag(holder);
        } else {
            holder = (UserHolder) row.getTag();
        }

        User user = data[position];
        holder.txtTitle.setText(user.title);    
        holder.imgIcon.setImageResource(user.icon);
        holder.showHide.setText(user.buttonName);
        return row;
    }

    static class UserHolder {
        ImageView imgIcon;
        TextView txtTitle;
        Button showHide;    
    }
}

该行的我的 Java 对象。我创建了两个构造函数,一个用于按钮,一个用于图像和文本。

public class UserAccountData {
    public int icon;
    public String type;
    public String title;
    public CharSequence buttonName;
    public UserAccountData(){
        super();
    }
    // for image and text
    public UserAccountData(int icon, String title, String type) {
        super();
        this.icon = icon;
        this.title = title;
        this.type = type;
    }
    // for button
    public UserData(CharSequence buttonName, String type) {
        super();
        this.buttonName = buttonName;
        this.type = type;
    }

    public void setType(String type){
        this.type = type;
    }
}

在我的活动中,我将以下两行添加到数组中,稍后我的适配器将使用它来创建 listView(我传递给它的 ArrayList 被更改为数组)

user_data.add(new UserAccountData(icon, "title,"type"));
user_data.add(new UserAccountData("show Password","button"));

a) 有没有办法拆分 listView 和中间并添加一个按钮?并继续相同的listView?因为我当前的解决方案试图在一行中添加一个按钮。

b)任何想法为什么我实际上也在图标中添加一个空按钮,标题类型行?我在实际的 listView 上得到图标、标题、空按钮

非常感谢你

更新:找到两个博客 http://logc.at/2011/10/10/handling-listviews-with-multiple-row-types/http://android.amberfog.com/?p=296 ,但仍然不没有运气。将不胜感激一些更深入的帮助

4

1 回答 1

3

有没有办法拆分 listView 和中间并添加一个按钮?并继续相同的listView?因为我当前的解决方案试图在一行中添加一个按钮。

如果我理解你的问题,你想要类似的东西:

我的列表视图将具有:

  • 图片+文字
  • 图片+文字
  • 按钮
  • 图片+文字

ETC...

getViewTypeCount()如果您覆盖和 ,您可以拥有不止一种类型的行布局getItemViewType()

  • getViewTypeCount()应该返回类型的数量,在本例中为 2。
  • getItemViewType(int position)将返回该行position所在的类型,在本例中为 0 或 1。

添加

我真的不知道如何区分图像文本行和按钮。我试图找到一种方法来查看我的图像是否为空(使用第二个构造函数),但这似乎不起作用

这听起来是个不错的方法,但由于iconint永远不会是null,因此未初始化整数的默认值为 0。试试:

@Override
public int getItemViewType(int position) {
    UserAccountData data = getItem(position);
    if(data.icon == 0)
        return 1;
    return 0;

    // The same thing in one line:
    //return getItem(position).icon == 0 ? 1 : 0;
}
于 2013-01-28T19:45:35.297 回答