在android listView中只向一行添加按钮

时间:2013-01-28 19:34:12

标签: android android-listview android-button android-adapter

我正在尝试在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 ,但仍然没有任何运气。希望得到一些更深入的帮助

1 个答案:

答案 0 :(得分:3)

  

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

如果我理解你的问题,你想要的是:

  

我的列表视图将包含:

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

等...

如果您覆盖getViewTypeCount()getItemViewType(),则可以有多种类型的行布局。

  • getViewTypeCount()应返回类型数量,在本例中为2.
  • getItemViewType(int position)将返回position处的行的类型,在这种情况下为0或1。

添加

  

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

这听起来不错,但由于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;
}