包含CheckBox的列表项布局无法按预期工作

时间:2014-11-13 14:10:33

标签: android android-layout android-listview android-checkbox

我有ListView,其布局包含CheckBox

我希望CheckBox都处于活动状态,并列出项目本身是可以点击的。

它不起作用。

是的,我知道典型的解决方案(在focusable上将CheckBox设置为false,以便它不会窃取焦点)。它没有帮助。

这是我的列表项的布局:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"

    android:id="@+id/rl_container"

    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:padding="8dp">

    <ImageView
        android:id="@+id/img_icon"
        android:layout_width="48dp"
        android:layout_height="48dp"
        android:layout_margin="8dp"
        android:contentDescription="@null"
        android:scaleType="centerInside"
        android:visibility="gone"/>

    <RelativeLayout
        android:id="@+id/rl_texts"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@id/img_icon"
        android:layout_centerVertical="true">

        <TextView
            android:id="@+id/txt_name"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:textIsSelectable="false"
            android:textColor="@color/black"/>

        <TextView
            android:id="@+id/txt_subtitle"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_below="@id/txt_name"
            android:textIsSelectable="false"/>
    </RelativeLayout>

    <CheckBox
        android:id="@+id/cb_toggle_switch"
        android:focusable="false"
        android:focusableInTouchMode="false"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_toLeftOf="@+id/img_arrow"
        android:layout_alignWithParentIfMissing="true"
        android:layout_marginRight="25dp"/>

    <ImageView
        android:id="@+id/img_arrow"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/arrow_button"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"/>

</RelativeLayout>

这是托管列表的片段:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
                android:id="@+id/content"
                android:layout_width="match_parent"
                android:layout_height="match_parent">

    <ListView
        android:id="@+id/list"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:cacheColorHint="#00000000"

        android:clipToPadding="false"
        android:divider="@null"
        android:dividerHeight="0dp"
        android:listSelector="#00000000"
        android:paddingBottom="60dp"/>

</RelativeLayout>

非常简单。

仅从布局中删除CheckBox可以解决问题(列表项的可用性,显然;我没有复选框)。

Visibility的{​​{1}}设置为CheckBox(我实际上必须为某些项目执行此操作)并不能解决问题。

GONE根本不起作用。

OnItemClickListener个项目 - OnClickListener(整个列表项的根视图)和rl_container(复选框)种类有效。

似乎不是确定性的。重复单击有时会触发容器的单击侦听器和复选框,一旦您在复选框上连续单击几次,就可以强制切换其状态。但它永远不会立竿见影。

这让我怀疑在幕后我们有一些关于焦点的复杂逻辑,但我将cb_toggle_switch附加到容器和复选框,它们甚至都没有被通知。

我尝试摆弄OnFocusChangeListener(在descendantFocusability上),禁用并启用容器(根)布局的可聚焦性和可点击性。

删除所有子视图并仅保留容器和复选框会留下同样的问题。

有什么想法吗?你会尝试什么?

3 个答案:

答案 0 :(得分:0)

我在大约一天前回答了类似的问题,除了图像按钮之外,如果您将图像按钮修改为复选框,这应该可以使用,检查出来。

import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;

import java.util.ArrayList;

import android.app.Activity;
import android.os.Bundle;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
import android.widget.Toast;

public class MainActivity extends Activity {
    /** Called when the activity is first created. */
    ListView lv;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.list);
        lv = (ListView) findViewById( R.id.list );
        lv.setOnItemClickListener(
                new OnItemClickListener() {
                    public void onItemClick(AdapterView<?> arg0,
                            android.view.View arg1, int arg2, long arg3) {
                        Toast.makeText( MainActivity.this,
                                arg2 + " clicked",
                                Toast.LENGTH_SHORT).show();
                    }
            });
        ArrayList<String> items = new ArrayList<String>();
        items.add( "item1");
        items.add( "item2");
        items.add( "item3");
        items.add( "item4");
        items.add( "item5");
        items.add( "item6");
        items.add( "item7");
        items.add( "item8");
        items.add( "item9");
        items.add( "item10");
        items.add( "item11");
        items.add( "item12");
        items.add( "item13");
        items.add( "item14");
        items.add( "item15");
        ListAdapter adapter = new ListAdapter( this, items);
        lv.setAdapter( adapter );
    }  
}

和...

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.view.View.OnClickListener;
import android.widget.ImageButton;
import android.widget.TextView;
import android.widget.BaseAdapter;
import android.widget.Toast;

import java.util.List;

public class ListAdapter extends BaseAdapter {

    public ListAdapter(Context context,
                        List<String> items ) { 
        inflater = LayoutInflater.from( context );
        this.context = context;
        this.items = items;
    }

    public int getCount() {                        
        return items.size();
    }

    public Object getItem(int position) {     
        return items.get(position);
    }

    public long getItemId(int position) {  
        return position;
    }

    public View getView(int position, View convertView, ViewGroup parent) { 
        String item = items.get(position);
        View v = null;
        if( convertView != null )
            v = convertView;
        else
            v = inflater.inflate( R.layout.item, parent, false);
        TextView itemTV = (TextView)v.findViewById( R.id.item);
        itemTV.setText( item );
        ImageButton button = 
            (ImageButton)v.findViewById( R.id.button);
        button.setOnClickListener(
                    new OnClickListener() {
                        public void onClick(View v) {
                            Toast.makeText( context,
                                    "ImageButton clicked",
                                    Toast.LENGTH_SHORT).show();
                        }
                    });
        return v;
    }

    private Context context;
    private List<String> items;
    private LayoutInflater inflater;
}
祝你好运!

答案 1 :(得分:0)

我在行中有一个带CheckBoxes的ListView。这是我做的:

对于row.xml中的根视图,我添加了:

android:descendantFocusability="blocksDescendants"

对于层次结构中的子元素(CheckBoxes),我添加了:

android:clickable="false"
android:focusable="false"
android:focusableInTouchMode="false"

答案 2 :(得分:0)

如果不想在按下列表项时选择它,则可以将属性添加到复选框属性:  android:enabled="false"