2017-09-02 15 views
1

コードサンプル:KotlinのListViewから選択した項目を取得するには?

package tech.kapoor.listviewdemo 

import android.content.Context 
import android.graphics.Color 
import android.support.v7.app.AppCompatActivity 
import android.os.Bundle 
import android.view.View 
import android.view.ViewGroup 
import android.widget.BaseAdapter 
import android.widget.ListView 
import android.widget.TextView 
import android.widget.AdapterView 


class MainActivity : AppCompatActivity() { 

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

     val listView = findViewById<ListView>(R.id.main_listview) 
     var redColor = Color.parseColor("#FF0000") 

     listView.setBackgroundColor(redColor) 
     listView.adapter = CustomAdapter(this) 
    } 

    private class CustomAdapter(context: Context): BaseAdapter() { 

     private val mContext: Context 

     init { 
      mContext = context 
     } 

     override fun getCount(): Int { 
      return 80 
     } 

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

     override fun getItem(position: Int): Any { 
      return position 
     } 

     override fun getView(position: Int, view: View?, viewGroup: ViewGroup?): View { 
      val textView = TextView(mContext) 
      textView.text = "Here comes the !!" 
      return textView 
     } 
    } 
} 

私は、最初の基本を理解するために、リストビューの代わりに、リサイクルビューを理解しようとしています。 誰かがselectまたはonclickで選択された行id/index値を取得する方法を知っていますし、kotlinの特定の行を選択する際に何らかのアクションを実行する方法も知っていますか?

答えて

1

リストビューを作成するには、データセットが必要です。データセットは、Stringsのようなデータ型のリストでも、モデルクラスのリストも使用できます。

これは私がListViewコントロールで使用するデータセットの私の単純なリストである:このような何か

val data = ArrayList<TopicDTO>() 
data.add(TopicDTO("1", "Info 1", true)) 
data.add(TopicDTO("2", "Info 2", false)) 
data.add(TopicDTO("3", "Info 3", true)) 
data.add(TopicDTO("4", "Info 4", false)) 

は、私は1つのモデルIDが含まれていTopicDTOという名前のクラス、タイトルとそのステータスを作成しました。

今度は、リストビューにこれを移入してみましょう。ここでは

list.adapter = ButtonListAdapter(baseContext, data) 

は、単純なアダプタです:

class ButtonListAdapter(//Class for rendering each ListItem 

     private val context: Context, private val rowItems: List<TopicDTO>) : BaseAdapter() { 

    override fun getCount(): Int { 
     return rowItems.size 
    } 

    override fun getItem(position: Int): Any { 
     return rowItems[position] 
    } 

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


    private inner class ViewHolder { 
     internal var main_text: TextView? = null //Display Name 
     internal var subtitle: TextView? = null //Display Description 
     internal var can_view_you_online: Button? = null //Button to set and display status of CanViewYouOnline flag of the class 

    } 

    override fun getView(position: Int, convertView: View?, parent: ViewGroup): View { 
     var convertView = convertView 
     var holder: ViewHolder? = null 


     val mInflater = context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE) as LayoutInflater 

     holder = ViewHolder() 


     if (convertView == null) { 
      convertView = mInflater.inflate(R.layout.main_lp_view_item, null) 

      holder.main_text = convertView!!.findViewById(R.id.main_lp_text) as TextView 
      holder.subtitle = convertView.findViewById(R.id.main_lp_subtitle) as TextView 
      holder.can_view_you_online = convertView.findViewById(R.id.can_view_you_online) as Button 

      convertView.tag = holder 

     } else { 
      holder = convertView.tag as ViewHolder 
     } 

     val rowItem = rowItems[position] 

     val main_text: String 
     val subtitle: String 


     holder.main_text!!.text = rowItem.info 
     holder.subtitle!!.text = rowItem.info 

     if (rowItem.canViewYouOnline) { 
      holder.can_view_you_online!!.setBackgroundColor(context.resources.getColor(R.color.colorPrimary)) 
     } else { 
      holder.can_view_you_online!!.setBackgroundColor(context.resources.getColor(R.color.colorAccent)) 
     } 


     holder.can_view_you_online!!.setOnClickListener(object : View.OnClickListener { 
      internal var buttonClickFlag: Boolean = false 


      override fun onClick(v: View) {   //The Onclick function allows one to click the button on the list item and set/reset the canViewYouOnline flag. It is working fine. 

      } 
     }) 


     return convertView 

    } 


} 

今、あなたはこのようなあなたの選択した項目を取得することができます:

list.onItemClickListener = AdapterView.OnItemClickListener { parent, view, position, id -> 
      // This is your listview's selected item 
      val item = parent.getItemAtPosition(position) as TopicDTO 
     } 

はあなたを願っていますこれを理解する。

+0

私はiOS開発プラットフォームから来ています。あなたが私に尋ねる気にしないで、付属のコードで動作させるにはどうすればいいですか? –

+0

要件を最初に指定してください。あなたは基本的に何をしたいですか?選択した項目またはクリックした項目のArrayList? – AndiM

+0

質問に記載されているようにクリックしただけのアイテムです。 –

1

あなたはgetView()法のようなものの内部で使用することができます。

view.setOnClickListener(object : View.OnClickListener { 
    override fun onClick(v: View?) { 
     //use getItem(position) to get the item 
    } 
}) 

やラムダを使用して:

view.setOnClickListener({ v -> //use theItem(position) }) 

だけヒント:

私はリストを理解しようとしていますリサイクルビューの代わりにビューを使用して、基本を最初に理解してください。

私の意見では、プロジェクトでは、RecyclerViewを99%のケースで使用します。

+0

これはJavaコードです。 –

+0

@AshishKapoorそうです。 –

+0

このためのGithubリポジトリを作成しました。プルリクエストで同じものを表示できますか? https://github.com/AshishKapoor/ListViewDemo –

関連する問題