ListView 中的自定义复选框

Posted

技术标签:

【中文标题】ListView 中的自定义复选框【英文标题】:Custom checkBox in ListView 【发布时间】:2015-06-27 03:21:46 【问题描述】:

在我的应用程序中,我有一个带有自定义行的 ListView,我想为每个项目添加一个自定义 CheckBox,如下所示:

当我点击“编辑”时,我希望 ListView 向右平移,并在每个 ListView 行的左侧显示一个自定义 CheckBox

即使看不到某些行图标(如星形或箭头),是否可以将ListView 保持在右侧?或者,如果我翻译右边的ListView,行被压缩并且所有图标都可见?

我已经发了TranslateAnimation:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

<translate
    android:fromXDelta="0%"
    android:toXDelta="17%"
    android:duration="750" />

</set>

我已经成功翻译了ListView,但在 2 秒后它又回到了初始位置……我该如何管理ListViewTranslateAnimation 之后保持不变?

在行的左侧放置一个像“gone”这样的复选框,当按下“EDIT”按钮以使所有复选框都可见时会更好吗?在这种情况下,每一行是像图像一样向右平移还是被压缩并且所有图标都可见?

谢谢

编辑:

我的行 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_
   android:layout_
   android:background="@color/backgr_greysoft" >

   <LinearLayout
      android:id="@+id/row_information"
      android:layout_
      android:layout_
      android:background="@drawable/button_file"
      android:descendantFocusability="blocksDescendants"
      android:layout_margin="@dimen/rowDescargas_marginLateral"
      android:orientation="horizontal"
      android:weightSum="1" >

      <ImageView
         android:id="@+id/icon"
         android:layout_
         android:layout_
         android:layout_gravity="center"
         android:layout_margin="@dimen/rowDescargas_marginIcono"
         android:layout_weight="0.25" />

      <LinearLayout
      ...
      </LinearLayout>

    </LinearLayout>

 </RelativeLayout>

【问题讨论】:

不完全是你要找的东西,但this 应该给你一个公平的想法 【参考方案1】:

是的,放一个像gone这样的复选框。并设置为您的信息视图如下:

android:layout_
android:layout_weight="1"

此视图的父级应为 LinearLayoutandroid:orientation="horizontal"

【讨论】:

但是,我应该为 CheckBox 设置什么宽度和重量?因为如果我将 weight=1 放在另一个视图中... 对于CheckBox 设置android:layout_width="wrap_content"【参考方案2】:

custom_checkbox.xml

    <?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_checked="true" 
          android:drawable="@xml/checked" /> 
    <item android:state_pressed="true"
          android:drawable="@xml/checked" /> 
    <item android:drawable="@xml/unchecked" /> 
</selector>

checked.xml

    <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:startColor="#ff2665B4" android:endColor="#ff2665B4" android:angle="270"/>
    <stroke android: android:color="#ffc0c0c0" />
    <size android: android:/>
</shape>

unchecked.xml

    <?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle">
    <gradient android:startColor="#ffffff" android:endColor="#ffffff" android:angle="270"/>
    <stroke android: android:color="#ffc0c0c0" />
    <size android: android:/>
</shape>

设置为复选框

facilityCheck.setButtonDrawable(R.xml.custom_checkbox);


<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_
   android:layout_
   android:background="@color/backgr_greysoft" >

<CheckBox 
           android:layout_
           android:layout_
           android:id="@+id/chk_facility"
           android:layout_alignParentLeft="true"
           />

      <ImageView
         android:id="@+id/icon"
         android:layout_
         android:layout_
         android:layout_gravity="center"
         android:layout_margin="@dimen/rowDescargas_marginIcono"
         android:layout_toRightOf="@+id/chk_facility" />
 </RelativeLayout>

【讨论】:

我在最后一行得到一个 'NullPointerException' ...(3 个文件放在 'res/xml' 文件夹中) facilityCheck 是您在 listview 行 xml 文件中的复选框。 我已经知道了,我的适配器类有问题。你知道我应该给复选框添加多少重量吗?还是不增重? 我觉得没必要增重。 请给我你的行 xml 文件。

以上是关于ListView 中的自定义复选框的主要内容,如果未能解决你的问题,请参考以下文章

带有复选框的自定义 ListView 检查未选中的项目

Android中项目的自定义ListView点击问题

TextView 在 ListView 内的自定义 ArrayAdapter 中被切断

滚动自定义 ListView 时,复选框值发生变化

listView中带有复选框的自定义布局:当我删除一行时,如果选中它(checkBox = true),则下一行将获得检查

ListView 中的自定义过滤 ArrayAdapter