質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.64%

ListViewのなかで設置したswitchの動きが取得できない。

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 731

kitarou

score 6

コード

Android Studio で、言語はKotlinを使用して開発をしています。
Listviewに配置したswitchの動きがリスナーでとれないので困っています。
気づいたことなどありましたら、教えて頂けると幸いです。

NavigationDrawer の Navigationview に入れ子にしたListviewがあり、そこにswitchを設置したのですが、
項目をクリックした時に期待通り動いてくれません。 現状では以下のコードでアプリが起動直後に落ちる結果になります。
期待値としては、LIstviewのswitchをタップ(切り替え)すると、ONとOFFそれぞれでトーストを表示したいです。

元々、navigationViewを表示するのにハンバーガメニューなど使用せず。複数のボタン押下で左から表示されるという動きを
期待していて、可能であれば、一つのnavigationviewで、以下の様な menu レイアウトを切り替えるという事がしたいです。
app:menu="@menu/navigation_drawer"
しかしこの方法も見つかっていないので、もしご存知の方がいらっしゃいましたら教えて頂けると幸いです。

navigationviewnのレイアウトです。

<android.support.design.widget.NavigationView
            android:id="@+id/nav_view"
            android:clickable="true"
            android:layout_width="wrap_content"
            android:layout_height="match_parent"
            android:layout_gravity="left"
            android:layout_marginTop="30dp"
            app:headerLayout="@layout/nav_header_main"
            android:fitsSystemWindows="false"
            android:visibility="invisible"
            app:itemTextColor="#FEFEFE">

        <ListView
                android:id="@+id/nav_menu_items_switch"
                android:divider="@null"
                android:layout_width="match_parent"
                android:layout_height="match_parent"
                android:layout_marginBottom="0dp"
                android:layout_marginTop="20dp"/>


    </android.support.design.widget.NavigationView>

` }'`````````

これがListの1行レイアウトです。

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/image"
android:layout_width="54dp"
android:layout_height="50dp"/>
<TextView
android:text="TextView"
android:layout_width="161dp"
android:layout_height="46dp"
android:id="@+id/title"
android:layout_weight="1"/>
<Switch
android:text="Switch"
android:layout_width="164dp"
android:layout_height="53dp"
android:id="@+id/switch_1"
android:layout_weight="1"
android:checked="true"
android:focusable="false"
android:layout_marginRight="30dp"/>
</LinearLayout>

ここがlistを表示するActivityの 全文です。

本来setOnItemClickListener にタップされた時の動きをかくと思うのですが、switchだとadapterに書いている記事を見かけたので、同じくそちらに書いているのですが間違えているでしょうか。

class Webview_indexActivity : AppCompatActivity(), NavigationView.OnNavigationItemSelectedListener {






override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_webview_index)





val switch = Switch(this)


switch.setOnCheckedChangeListener({ button, isChecked ->

val text = if (isChecked) "checked" else "unchecked"
Toast.makeText(this, text, Toast.LENGTH_LONG).show()
})


//val switchmenu = nav_view.menu.findItem(R.id.navigation_notifications)
//
// switchmenu.actionView = switch






mutableListOf<MenuItem>()

val  menuItem_right = mutableListOf<MenuItem>()
menuItem_right.add(MenuItem("設定",R.drawable.button_category_clothes_icon))
menuItem_right.add(MenuItem("設定",R.drawable.button_category_food_icon))
menuItem_right.add(MenuItem("設定",R.drawable.button_category_hobby_icon))

nav_menu_items.adapter = MenuItemAdapter(this,menuItem_right)

nav_menu_items.setOnItemClickListener {parent, view, position, id ->

Toast.makeText(this, "Clicked: ${id}", Toast.LENGTH_SHORT).show()



drawer_layout.closeDrawer(Gravity.LEFT)
drawer_layout.closeDrawer(Gravity.RIGHT)

}

//左側の switchのlistの設定

mutableListOf<MenuItem_switch>()
val menuItem_left_switch = mutableListOf<MenuItem_switch>()

menuItem_left_switch.add(MenuItem_switch("設定",switch))
menuItem_left_switch.add(MenuItem_switch("設定",switch))
menuItem_left_switch.add(MenuItem_switch("設定",switch))

nav_menu_items_switch.setOnItemClickListener { parent, view, position, id ->

drawer_layout.closeDrawer(Gravity.LEFT)
drawer_layout.closeDrawer(Gravity.RIGHT)

}


//左側の通常のlistの設定
mutableListOf<MenuItem_normal>()
val menuItem_left_normal = mutableListOf<MenuItem_normal>()

menuItem_left_normal.add(MenuItem_normal("設定",R.drawable.button_category_clothes_icon))
menuItem_left_normal.add(MenuItem_normal("設定",R.drawable.button_category_clothes_icon))
menuItem_left_normal.add(MenuItem_normal("設定",R.drawable.button_category_clothes_icon))

nav_menu_items_switch.setOnItemClickListener { parent, view, position, id ->

Toast.makeText(this, "Clicked: ${id}", Toast.LENGTH_SHORT).show()

drawer_layout.closeDrawer(Gravity.LEFT)
drawer_layout.closeDrawer(Gravity.RIGHT)

}


nav_view.setNavigationItemSelectedListener(this)
nav_view_right.setNavigationItemSelectedListener(this)



right_btn.setOnClickListener {
nav_view_right.setBackgroundResource(R.drawable.pic_rightbar_bg2)
this.drawer_layout.openDrawer(nav_view_right)

}

menuBtn.setOnClickListener {
nav_view.setBackgroundResource(R.drawable.pic_category_bg)
nav_menu_items_switch.adapter = MenuItem_switchAdapter(this,menuItem_left_switch)

this.drawer_layout.openDrawer(nav_view)


}

menu2Btn.setOnClickListener {
nav_view.setBackgroundResource(R.drawable.pic_detailed_search_bg)
nav_menu_items_switch.adapter = MenuItem_normalAdapter(this,menuItem_left_normal)
this.drawer_layout.openDrawer(nav_view)
}
}

override fun onNavigationItemSelected(item: android.view.MenuItem): Boolean {

when (item.itemId) {
R.id.navigation_home -> Toast.makeText(this,"テスト表示1",Toast.LENGTH_LONG).show()
R.id.navigation_dashboard -> Toast.makeText(this,"テスト表示2",Toast.LENGTH_LONG).show()
R.id.navigation_notifications -> Toast.makeText(this,"テスト表示3",Toast.LENGTH_LONG).show()
R.id.config1 -> Toast.makeText(this,"テスト表示4",Toast.LENGTH_LONG).show()
R.id.config2 -> Toast.makeText(this,"テスト表示5",Toast.LENGTH_LONG).show()
}

drawer_layout.closeDrawer(Gravity.LEFT)
drawer_layout.closeDrawer(Gravity.RIGHT)
return true

}

override fun onCreateOptionsMenu(menu: Menu?): Boolean {

menuInflater.inflate(R.menu.bottom_navigation_item,menu)
return super.onCreateOptionsMenu(menu)
}


}

1行のモデルクラス

import android.media.Image
import android.widget.ImageView
import android.widget.Switch

class MenuItem_switch (
val title2: String,
val switch2: Switch
)

adapterの全文

class MenuItem_switchAdapter(val context: Context, val items: List<MenuItem_switch>): BaseAdapter() {
val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater

override fun getCount(): Int {
return items.count()
}

override fun getItem(position: Int): MenuItem_switch {
return items[position]
}

override fun getItemId(position: Int): Long {
return position.toLong()
}



override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View {

val view_switch = layoutInflater.inflate(R.layout.menu_item2,parent,false)

view_switch.title.text = items[position].title2

view_switch.switch_1.setOnCheckedChangeListener{ buttonView, isChecked ->
if (isChecked){
Toast.makeText(context, "ON: $", Toast.LENGTH_SHORT).show()

}else{
Toast.makeText(context, "OFF: ${items[position].switch2}", Toast.LENGTH_SHORT).show()

}
}

return view_switch


}
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • jimbe

    2019/08/19 23:13 編集

    ご提示ありがとうございます.

    スイッチの ON/OFF の保持に関しましては, jun74 さんの仰る通り, スイッチの状態を別途保持しておく必要があります. といいますか, ListView は表示しかしませんので, データを持っていなくては表示できません.
    ですが構造としましては, private ArrayList<Boolean> m_sw; と別に持つのではなく, MenuItem_switch に入れておくのが良いかと思います.

    class MenuItem_switch (
    val title2: String,
    //val switch2: Switch
    val switch2: Boolean
    )

    そして, getView にて text の設定と同時に switch には switch2 の値を入れます.

    view_switch.title.text = items[position].title2
    view_switch.switch_1.isChecked = items[position].switch2

    リスナでは items を更新します.

    view_switch.switch_1.setOnCheckedChangeListener{ buttonView, isChecked ->
    items[position].switch2 = isChecked
    :

    キャンセル

  • jimbe

    2019/08/19 23:34

    MenuItem_switch の構造が変わるため,
    > menuItem_left_switch.add(MenuItem_switch("設定",switch))

    menuItem_left_switch.add(MenuItem_switch("設定",true)) //第二引数は true か false
    とする必要があります. Switch の実体は要りません.

    キャンセル

  • kitarou

    2019/08/20 20:32

    ご丁寧に説明頂き恐縮です、
    なるほど、保持する為に、Boolean をクラスで持てばいいんですね、
    試してみます。 ありがとうございます!

    キャンセル

回答 1

check解決した方法

0

Activity 内の、menuItem_left_switch.add(MenuItem_switch("設定",switch_1)) の中の
switch_1を、 val switch = Switch(this) という 実体?を宣言して、これと入れ替えてあげると、
adapter の setOnCheckedChangeListener でswitch のON,OFFを検知できるようになりました。
まだ動きの原因がはっきり理解していませんが、ひとまず主題の問題の動きは確認できたので解決とさせて頂きます。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.64%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る