Android Kotlin BaseAdapterでListViewを表示
やりたいこと
・定義したクラスのオブジェクトのリスト表示がしたい
・ネット上の画像を表示したい
RestAPIリクエストしてレスポンスを表示するようなありがちな形をイメージしてる
また、画像の表示にはPicassoというのが使ってる人が多そうなので使ってみる
以下のクラスのインスタンスのリストをListViewに表示する。imageUrlにはURL文字列を格納
// User.kt class User( val id: Int, val name: String, val imageUrl: String, val comment: String )
app/build.gradle
dependencies { ・・・ implementation 'com.squareup.picasso:picasso:2.71828' }
MainActivity
package com.example.list import android.support.v7.app.AppCompatActivity import android.os.Bundle import com.example.list.Adapter.UserAdapter import com.example.list.Model.User import kotlinx.android.synthetic.main.activity_main.* class MainActivity : AppCompatActivity() { var users = mutableListOf<User>() override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) val imageURL = "https://example.com/path/to/img.jpg" val commnet = "テキストテキストテキストテキストテキストテキストテキストテキストテキストテキスト" users.add(User(1, "ユーザー1", imageURL, commnet)) users.add(User(2, "ユーザー2", imageURL, commnet)) users.add(User(3, "ユーザー3", imageURL, commnet)) users.add(User(5, "ユーザー4", imageURL, commnet)) users.add(User(6, "ユーザー5", imageURL, commnet)) listView.adapter = UserAdapter(this, users) } }
res/layout/activity_main.xml
<ListView android:id="@+id/listView" android:layout_width="match_parent" android:layout_height="match_parent"/>
res/layout/user_item.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:padding="3sp"> <ImageView android:id="@+id/thumbnail" android:padding="5sp" android:layout_width="100sp" android:layout_height="100sp" /> <TextView android:id="@+id/name" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_toRightOf="@+id/thumbnail" android:textColor="#000" android:textStyle="bold" android:textSize="16sp" android:layout_marginTop="5sp" android:layout_marginLeft="5sp"/> <TextView android:id="@+id/comment" android:layout_width="match_parent" android:layout_height="wrap_content" android:layout_below="@+id/name" android:layout_toRightOf="@+id/thumbnail" android:textColor="#000" android:textSize="14sp" android:padding="5sp"/> </RelativeLayout>
Adapter/UserAdapter.kt
package com.example.list.Adapter import android.content.Context import android.view.LayoutInflater import android.view.View import android.view.ViewGroup import android.widget.BaseAdapter import com.example.list.Model.User import com.example.list.R import com.squareup.picasso.Picasso import com.squareup.picasso.PicassoProvider import kotlinx.android.synthetic.main.user_item.view.* class UserAdapter(val context: Context, val users: List<User>): BaseAdapter() { val layoutInflater = context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) as LayoutInflater override fun getCount(): Int { return users.count() } override fun getItem(position: Int): User { return users[position] } override fun getItemId(position: Int): Long { return position.toLong() } override fun getView(position: Int, convertView: View?, parent: ViewGroup?): View { val view = layoutInflater.inflate(R.layout.user_item, parent, false) Picasso.get().load(users[position].imageUrl).into(view.thumbnail) view.name.text = users[position].name view.comment.text = users[position].comment return view } }
次回コピペで使えるようにメモした。以上