自定义`ListView`或TableLayout?

AMH*_*AMH -2 android android-listview android-tablelayout

我需要创建一个ListViewTableLayout每行包含3列和3个按钮,类似于:

在此输入图像描述

但屏幕不仅包含此控件将包含文本字段和其他布局,我需要一个网格采取如下形状(例如).

有关如何实现这一点以及如何处理Button点击的任何想法?由于我是Android的新手,我不知道如何创建它.

在此输入图像描述

Tia*_*ida 7

A ListView主要用于可变数据.如果您有某种类型的数据可以每次都以相同的方式显示并且可以增长/删除,那么ListView是一个不错的选择.

另一方面,如果你有静态数据,静态布局(如TableLayout,LinearLayout等)是一个不错的选择.这完全取决于您拥有的数据以及您希望如何使用它.

我希望您不要在屏幕截图上使用相同的列,因为您在智能手机上没有这个空间.

假设您想要3列,并且该数据是可变的.

您可以使用costum的ListView具有LinearLayout与根android:orientation="horizontal.然后在你的每个元素插入你需要使用layout_weight="1"android:layout_width="0dp".这种组合可以保证ListView行上的每个元素都具有相同的宽度,因此它是可选的.

您的costum列表行应该如下所示:

<LinearLayout
    android:layout_width="fill_parent"
    ...
    android:orientation="horizontal" >
<TextView
   android:layout_width="0dp"
   ...
   android:layout_weight="1" />
...
Run Code Online (Sandbox Code Playgroud)

要处理按钮单击setOnClickListener,当您在getView服务器ListView上的适配器内的方法中获取它时,您需要在按钮中执行此操作.

然后,您可能会在单击按钮和ListView时遇到问题.解决这个问题的常用方法是将按钮放在android:focusable="false"声明它的xml处.但一次只有一件事;)

编辑(由于评论:添加禁用/启用按钮的复选框):

如果你想要一个复选框来禁用/启用按钮,你需要getView在你的服务器ListView的适配器上做一些工作.

你需要:

  • 使用以下内容获取Checkbox:CheckBox myCheckBox = (CheckBox) inflater.findViewById(R.id.checkboxid)其中inflater是您在getView中定义的那个,checkboxid是您在xml行中定义的ID.
  • 将按钮保存在您的复选框监听器中是可访问的:myCheckBox.setTag(button)按钮是您要启用/禁用的按钮,您可以像获取myCheckBox一样获取它
  • setOnCheckedChangeListener在复选框上设置一个,根据复选框的状态更改按钮的可见性.

最后一个子弹听起来应该是这样的:

myCheckBox.setOnCheckedChangeListener(new OnCheckedChangeListener() {
    public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
        Button myButton = (Button) buttonView.getTag();

        if ( isChecked ) 
            myButton.setVisibility(View.VISIBLE);
        else
            // Use GONE if you want to get that space for other views
            myButton.setVisibility(View.GONE); 

    }
});
Run Code Online (Sandbox Code Playgroud)