2017-09-30 17 views
-1

私はアンドロイドアプリのリストビューのカスタムアダプタを使用しています。アイテムのクリックに対してリスナーを設定する方法がわかりません。私は私のアプリにKotlinを使用しています。カスタムモデルを使用してリストビューを設定する方法Kotlin

これは私のアダプタレイアウトです。

<?xml version="1.0" encoding="utf-8"?> 
 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
 
    android:orientation="vertical" android:layout_width="match_parent" 
 
    android:layout_height="match_parent"> 
 
    <RelativeLayout 
 
     android:layout_width="match_parent" 
 
     android:layout_height="match_parent"> 
 
    <CheckBox 
 
     android:id="@+id/cbx" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:text="" /> 
 
    <TextView 
 
     android:id="@+id/txtNameNote" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="wrap_content" 
 
     android:text="TextView" 
 
     android:layout_toRightOf="@+id/cbx" 
 
     /> 
 
    <TextView 
 
     android:id="@+id/txtPercent" 
 
     android:layout_width="wrap_content" 
 
     android:layout_height="match_parent" 
 
     android:text="TextView" 
 
     android:layout_toRightOf="@+id/cbx" 
 
     android:layout_below="@+id/txtNameNote" 
 
     /> 
 
    </RelativeLayout> 
 
</LinearLayout>
これは私のアダプターコード

class CustomAdapter(internal var context: Context, resource: Int, internal var listNote: ArrayList<Note>) : ArrayAdapter<Note>(context, resource, listNote) { 
 
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { 
 
     var convertView = convertView 
 
     // TODO Auto-generated method stub 
 
     val inflater = (context as Activity).layoutInflater 
 
     convertView = inflater.inflate(R.layout.rowlistitem, parent, false) 
 
     val name = convertView!!.findViewById<View>(R.id.txtNameNote) as TextView 
 
     val percent = convertView.findViewById<View>(R.id.txtPercent) as TextView 
 
     val cb = convertView.findViewById<View>(R.id.cbx) as CheckBox 
 
     name.text = listNote[position].name 
 
     percent.text = "Percent: " + listNote[position].percent + "%" 
 

 
     if (listNote[position].status == NoteStatus.Active.value) 
 
      cb.isChecked = false 
 
     else{ 
 
      name.paintFlags = (name.paintFlags or Paint.STRIKE_THRU_TEXT_FLAG) 
 
      cb.isChecked = true 
 
     } 
 
     } 
 
     } 
 
     return convertView 
 
    } 
 
}

私を助けることができるいくつかのいずれかでありますか?

+0

アダプターコードは表示できますか? – pRaNaY

+0

私のアダプタコードを更新しました。レビューしてください。ありがとう! –

答えて

1

Kotlinの適切な方法は、コールバックを作成することです。次に、アダプタにクリックリスナを作成し、その結果をコールバックに転送します。あなたは、アダプタ

CustomAdapter(...., { info { "Clicked $it" } }) 

を作成し、あなたのビューで

class CustomAdapter(
     internal var context: Context, 
     resource: Int, 
     internal var listNote: ArrayList<Note>, 
     val callback: (Note) -> Unit) : ArrayAdapter<Note>(context, resource, listNote) { 
    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { 
     // .. do your bindings whatever 
     convertView.yourRootLayoutElement.setOnClickListener{ 
      if (callback != null) callback(listNote[position]) 
     } 
     return convertView 
    } 
} 

私はListViewコントロールを使用していないので、私はそれをテストしていませんでした。 RecyclerViewを使うことをお勧めします。 ListViewはで、これは非推奨のであり、いくつかの理由で推奨されていません。いくつかの理由を読むhere

編集:絶対に理由もなく RecyclerView上のリストビューを使用するがあります。それが動作しても、あなたはそれを使用すべきではありません。 ListViewははもはやが使用されないので、RecyclerViewを学んでください。

関連する問題