Android 在自定义数组适配器中未处于编辑模式时锁定复选框

标签 android checkbox android-arrayadapter editmode

我有一个 Activity ,它显示可分配给我的应用程序中的 Activity 事件的复选框(焦点区域)列表。但是,我希望能够阻止用户表单编辑这些值,直到单击按钮将表单置于编辑模式。

有人可以解释或提供代码示例,我如何将其实现到我的应用程序中吗?

此列表保存在 ListView 中,其中包含我为应用程序创建的 FocusArea 类型的自定义 ArrayAdapter。 Activity 的 xml 如下所示:

        <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent" android:background="@drawable/horizontal_gradient_line_reverse">

    <TextView
        android:id="@+id/textViewCustomerNameNumber"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Customer Name &amp; Number" android:layout_margin="5dp"/>

    <ListView
        android:id="@+id/listViewFocusAreas"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_above="@+id/relativeLayoutControls"
        android:layout_alignParentLeft="true"
        android:layout_below="@+id/textViewCustomerNameNumber"
        android:layout_margin="5dp"
        android:background="@drawable/myborder" >

    </ListView>

    <RelativeLayout
        android:id="@+id/relativeLayoutControls"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:layout_alignParentLeft="true" >


        <ImageView
            android:id="@+id/imageViewCancelFocusAreaChanges"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentRight="true"
            android:layout_alignParentTop="true"
            android:src="@drawable/ic_mini_undo" />

        <ImageView
            android:id="@+id/imageViewSaveFocusAreaChanges"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/imageViewCancelFocusAreaChanges"
            android:src="@drawable/ic_mini_save" />

        <ImageView
            android:id="@+id/imageViewEditFocusArea"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentTop="true"
            android:layout_toLeftOf="@+id/imageViewSaveFocusAreaChanges"
            android:src="@drawable/ic_mini_edit" />

    </RelativeLayout>


    <ImageView
        android:id="@+id/imageViewEditMode"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignBottom="@+id/textViewCustomerNameNumber"
        android:layout_alignRight="@+id/listViewFocusAreas"
        android:src="@drawable/edit16x16"
        android:visibility="gone" />

</RelativeLayout>

以下是焦点区域行的 xml:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical" >

    <CheckBox
        android:id="@+id/checkBoxFocusArea"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Focus Area" />

</LinearLayout>

以下是自定义ArrayAdapter的代码:

    public class FocusAreaAdapter extends ArrayAdapter<FocusArea> {

    private ArrayList<FocusArea> focusAreas;
    private Context context;

    public FocusAreaAdapter(Context context, int textViewResourceId, ArrayList<FocusArea> focusAreas) {
        super(context, textViewResourceId, focusAreas);
        this.context = context;
        this.focusAreas = focusAreas;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View v = convertView;
        if(v == null) {
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.focus_area_menu_item, null);
        }
        FocusArea focusArea = focusAreas.get(position);

        if(focusArea != null) {
            CheckBox cbFocusArea = (CheckBox)v.findViewById(R.id.checkBoxFocusArea);
            cbFocusArea.setText(focusArea.getFocusAreaCodeDescription());
            if(focusArea.isFocusAreaCodeChecked() == 1) {
                cbFocusArea.setChecked(true);
            } else {
                cbFocusArea.setChecked(false);
            }

            cbFocusArea.setOnClickListener(new View.OnClickListener() {
                public void onClick(View v) {
                    FocusArea focusArea = focusAreas.get(position);
                    if(focusArea.isFocusAreaCodeChecked() == 1) {
                        focusArea.setFocusAreaCodeChecked(0);
                    } else {
                        focusArea.setFocusAreaCodeChecked(1);
                    }
                }
            });
        }       
        return v;
    }
}

最后,我使用以下代码实例化我的自定义数组适配器:

    private void assignFocusAreasToAdapter() {
    // get reference to available responsibles list view control
    lvFocusAreas.clearChoices();

    // create an array adapter with the communications data array
    activityFocusAreaAdapter = new FocusAreaAdapter(this, R.layout.focus_area_menu_item, activityFocusAreas);

    // assign the my customers list control the array adapter
    lvFocusAreas.setAdapter(activityFocusAreaAdapter);
    activityFocusAreaAdapter.notifyDataSetChanged();
    Log.i(TAG, "Available Activity Focus Areas Loaded");
}

最佳答案

好的,我为可能遇到相同问题的任何人找到了该问题的解决方案。

重点领域 Activity 的 XML 与上面发布的相同。

焦点区域行项目的 XML 已相应修改:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    android:descendantFocusability="blocksDescendants" >

    <CheckBox
        android:id="@+id/checkBoxFocusArea"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Focus Area" />

</LinearLayout>

您可以看到现在添加了以下行 android:descendantFocusability="blocksDescendants" 这可以防止 onClickListener 复选框触发,而这通常会阻止 ListViews OnItemClickedListener 触发。

修改自定义适配器代码以删除 OnClickListener 复选框,如下所示:

public class FocusAreaAdapter extends ArrayAdapter<FocusArea> {

    private ArrayList<FocusArea> focusAreas;
    private Context context;

    public FocusAreaAdapter(Context context, int textViewResourceId, ArrayList<FocusArea> focusAreas) {
        super(context, textViewResourceId, focusAreas);
        this.context = context;
        this.focusAreas = focusAreas;
    }

    @Override
    public View getView(final int position, View convertView, final ViewGroup parent) {
        View v = convertView;
        if(v == null) {
            LayoutInflater vi = (LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
            v = vi.inflate(R.layout.focus_area_menu_item, null);
        }
        FocusArea focusArea = focusAreas.get(position);

        if(focusArea != null) {
            CheckBox cbFocusArea = (CheckBox)v.findViewById(R.id.checkBoxFocusArea);
            cbFocusArea.setText(focusArea.getFocusAreaCodeDescription());
            if(focusArea.isFocusAreaCodeChecked() == 1) {
                cbFocusArea.setChecked(true);
            } else {
                cbFocusArea.setChecked(false);
            }

            cbFocusArea.setClickable(false);            
        }       
        return v;
    }
}

自定义适配器使用与上面发布的相同的代码进行实例化,但您必须将 OnItemClickListener 添加到 ListView 并在 OnItemClickListener 单击事件中执行复选框检查,如下所示:

    lvFocusAreas = (ListView)findViewById(R.id.listViewFocusAreas);
    lvFocusAreas.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {
            if(editMode){
                FocusArea focusArea = (FocusArea)lvFocusAreas.getItemAtPosition(position);
                if(focusArea.isFocusAreaCodeChecked() == 0) {
                    focusArea.setFocusAreaCodeChecked(1);
                } else {
                    focusArea.setFocusAreaCodeChecked(0);
                }
                activityFocusAreaAdapter.notifyDataSetChanged();
                setControlsEnabled();
            }               
        }
    });

希望这对遇到同样问题的人有所帮助。 :D

关于Android 在自定义数组适配器中未处于编辑模式时锁定复选框,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10817089/

相关文章:

javascript - 如何使用 Ajax 通过复选框将对象移动到另一个范围?

java - 如何在 ArrayAdapter 中为 ListView 使用多个 TextView ?

Android - 无法访问类型的封闭实例

android - 用于处理未接来电的 PhoneGap 插件

Android TextView 自动滚动

javascript - 按类添加事件监听器,在 JS 中将 ID 作为参数传递

android - 自定义适配器的上下文参数 - getApplicationContext() 失败但 'this' 有效

java - Adapter.getItem(position) 使应用程序崩溃

c# - 显示空白的 XML 元素值

jquery - 如何在 jQuery 中设置一个复选框来锁定现有的滑动窗口,使其无法移动,然后通过取消选中该框来解锁它?