Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/213.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android:ListView:无法在自定义列表项中设置单选项_Android_Android Listview_Android Custom View_Selectlistitem - Fatal编程技术网

Android:ListView:无法在自定义列表项中设置单选项

Android:ListView:无法在自定义列表项中设置单选项,android,android-listview,android-custom-view,selectlistitem,Android,Android Listview,Android Custom View,Selectlistitem,我想创建一个单一项目的自定义视图,我有以下代码,但它不起作用。它选中多个复选框。有人能帮我解决这个问题吗 public class SingleChoiceRelativeLayout extends RelativeLayout implements Checkable{ private CheckBox checkableView; public SingleChoiceRelativeLayout(Context context, AttributeSet attrs,

我想创建一个单一项目的自定义视图,我有以下代码,但它不起作用。它选中多个复选框。有人能帮我解决这个问题吗

public class SingleChoiceRelativeLayout extends RelativeLayout implements Checkable{

private CheckBox checkableView;

public SingleChoiceRelativeLayout(Context context, AttributeSet attrs,
        int defStyle) {
    super(context, attrs, defStyle);
}

public SingleChoiceRelativeLayout(Context context, AttributeSet attrs) {
    super(context, attrs);
}

public SingleChoiceRelativeLayout(Context context) {
    super(context);
}

public CheckBox getCheckableView() {
    return checkableView;
}

public void setCheckableView(CheckBox checkableView) {
    this.checkableView = checkableView;
}

@Override
public void setChecked(boolean checked) {

    if (this.checkableView != null){

        this.checkableView.setChecked(checked);
    }
}

@Override
public boolean isChecked() {
    if (this.checkableView != null){
        this.checkableView.isChecked());
        return this.checkableView.isChecked();
    }

    return false;
}

@Override
public void toggle() {

    if (this.checkableView != null){

        this.checkableView.setChecked(!this.checkableView.isChecked());
    }


}

}


<com.xyz.view.SingleChoiceRelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:minHeight="47.5dip" >

    <TextView
        android:id="@+id/device_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_centerVertical="true"
        android:layout_marginLeft="24dip"
        android:text="Group 1"
        android:textColor="#393c3d"
        android:textSize="16sp" />

    <CheckBox
        android:id="@+id/tickmark_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_centerVertical="true"
        android:background="@android:color/transparent"
        android:button="@drawable/tick_mark_icon_state_drawable"
        android:checked="false"
        android:padding="10dip" />

    <!-- <View -->
    <!-- android:layout_width="match_parent" -->
    <!-- android:layout_height="0.5dip" -->
    <!-- android:layout_alignParentBottom="true" -->
    <!-- android:background="@color/action_bar_divider_line" /> -->

</com.xyz.view.SingleChoiceRelativeLayout>
公共类SingleChoiceRelativeLayout扩展了RelativeLayout实现可检查{
私有复选框检查视图;
公共SingleChoiceRelativeLayout(上下文、属性集属性、,
int-defStyle){
超级(上下文、属性、定义样式);
}
公共SingleChoiceRelativeLayout(上下文、属性集属性){
超级(上下文,attrs);
}
公共单选相对布局(上下文){
超级(上下文);
}
公共复选框getCheckableView(){
返回checkableView;
}
public void setCheckableView(复选框checkableView){
this.checkableView=checkableView;
}
@凌驾
公共void setChecked(布尔值已选中){
if(this.checkableView!=null){
this.checkableView.setChecked(已选中);
}
}
@凌驾
公共布尔值已检查(){
if(this.checkableView!=null){
this.checkableView.isChecked());
返回此.checkableView.isChecked();
}
返回false;
}
@凌驾
公共无效切换(){
if(this.checkableView!=null){
this.checkableView.setChecked(!this.checkableView.isChecked());
}
}
}

@覆盖
公共视图getView(int位置、视图转换视图、视图组父视图){
项目视图持有者视图持有者;
if(convertView==null){
LayoutInflater充气器=(LayoutInflater)mActivity.getSystemService(Context.LAYOUT\u充气器\u服务);
//为垂直列表项充气
convertView=充气机。充气(R.layout.list\u item\u devices\u layout,parent,false);
viewHolder=新项目viewHolder();
viewHolder.checkBox=(checkBox)convertView.findViewById(R.id.tickmark\u视图);
setOnCheckedChangeListener(新的OnDeviceSelectionChangedListener());
((SingleChoiceRelativeLayout)convertView).setCheckableView(viewHolder.checkBox);
viewHolder.deviceName=(TextView)convertView.findViewById(R.id.device\u name);
convertView.setTag(viewHolder);
}否则{
viewHolder=(ItemViewHolder)convertView.getTag();
}
setUpListItemView(视图持有者,位置);
返回视图;
}
适配器=新设备列表适配器(DeviceActivity.this,设备);
ListView列表=(ListView)findViewById(R.id.devices\u list\u view);
list.setSelection(ListView.CHOICE\u MODE\u SINGLE);
list.setOnItemClickListener(新的OnItemClickListener(){
@凌驾
public void onItemClick(AdapterView父级、视图、,
内部位置,长id){
//TODO自动生成的方法存根
}
});
list.setAdapter(适配器);
私有void setUpListItemView(ItemViewHolder viewHolder,int位置){
viewHolder.deviceName.setText(devicesList.get(position.getDeviceName());
}

创建用于选择索引的属性

int selectedIndex = -1;
OnDeviceSelectionChangedListener()中
获取所选项目的位置,并将其设置为
selectedIndex
,然后调用notifyDatasetChanged()刷新列表数据

 ....
 selectedIndex = position;
 notifyDatasetChanged();
 .....
然后在getView中使用此方法

if (position == selectedIndex ) {
   viewHolder.checkBox.setChecked(true);
} else {
   viewHolder.checkBox.setChecked(false);
}
  • 另一个答案
创建一个静态属性,用于在
SingleChoiceRelativeLayout
中选择索引

public static int selectedIndex = -1;
然后在McClickListener中:

list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                SingleChoiceRelativeLayout.selectedIndex = position;
                adapter.notifyDatasetChanged();

            }
        });

好的,我试试看。但是为什么我的自定义相对布局(SingleChoiceRelativeLayout)无法获取事件?因此无法处理此问题?因为您必须存储所选项目,您可以在
SingleChoiceRelativeLayout
类中使用一个静态属性来执行此操作,您是否可以发布
setUpListItemView
对不起,我无法理解您的观点,但我已经添加了您提到的代码。你能帮忙吗?你说的“延迟选择”是什么意思?
public static int selectedIndex = -1;
list.setOnItemClickListener(new OnItemClickListener() {

            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {

                SingleChoiceRelativeLayout.selectedIndex = position;
                adapter.notifyDatasetChanged();

            }
        });
  if (position == SingleChoiceRelativeLayout.selectedIndex ) {
       viewHolder.checkBox.setChecked(true);
    } else {
       viewHolder.checkBox.setChecked(false);
    }