2018年6月23日土曜日

IBM CloudのNoSQL DBを使ってみよう ~第6章~(Android:ListViewにボタン追加でListItemのClickイベントが効かない)

どうも、もりもりです。

ListViewにボタンを配置する前はTextViewだけで、リストアイテムのクリックで
取消線や文字色を制御していましたが
編集や削除のImageButtonを追加するとListViewのItemClickイベントが
走らなくなっちゃいました。

ということで、ListViewのItemClickイベントとImageButtonのClickイベント、
どちらも走るようにする方法についてです。

ListViewのアイテムクリックイベント


まずは、ListViewのアイテムをクリックした際の
イベントリスナーを設定するメソッドです。

private void setListViewListener() {
    mListView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
        @Override
        public void onItemClick(AdapterView parent, View view, int position, long id) {
            LinearLayout layout = (LinearLayout) view;
            TextView textViewDescription = (TextView) layout.findViewById(R.id.task_description);

            toggleTaskCompleteAt(position);
            Task task = (Task) mTaskAdapter.getItem(position);
            ControlUtility.changeItemState(textViewDescription, task.isCompleted());
        }
    });
}

編集、削除クリックイベント


編集クリックイベントのソースです。

public void onClickTaskEdit(View v) {
    this.editPosition = (Integer)v.getTag();
    this.showDialog(DIALOG_EDIT_TASK);
}

削除クリックイベントのソースです。

public void onClickTaskDelete(View v) {
    int position= (Integer)v.getTag();
    this.deleteTaskAt(position);
}

ListViewのItemレイアウト


ListViewの一行一行のレイアウトです。
10行目の「android:descendantFocusability="blocksDescendants"」が
必要となります。

<?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="horizontal"
    android:paddingLeft="?android:attr/listPreferredItemPaddingLeft"
    android:paddingRight="?android:attr/listPreferredItemPaddingRight"
    android:minHeight="?android:attr/listPreferredItemHeightSmall"
    android:background="@color/list_item_color"
    android:descendantFocusability="blocksDescendants">

    <TextView
        android:id="@+id/task_description"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_weight="1"
        android:textAppearance="?android:attr/textAppearanceListItemSmall"/>

    <ImageButton
        android:id="@+id/button_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="right"
        android:src="@android:drawable/ic_menu_edit"
        android:background="@color/list_item_button_color"
        android:onClick="onClickTaskEdit"/>

    <ImageButton
        android:id="@+id/button_delete"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:gravity="right"
        android:src="@android:drawable/ic_delete"
        android:background="@color/list_item_button_color"
        android:onClick="onClickTaskDelete"/>

</LinearLayout>

本当はActivity.showDialog()も3.x系以降は非推奨となったので
DialogFragmentを使用したかったのですが、今回はそこまで手がまわりませんでした。
また時間を見つけて試したいと思います。


ではまた、いつの日か~。

0 件のコメント:

コメントを投稿