我有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
上),禁用并启用容器(根)布局的可聚焦性和可点击性。
删除所有子视图并仅保留容器和复选框会留下同样的问题。
有什么想法吗?你会尝试什么?
答案 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"