单击列表项时如何显示完整信息?
How do I show full information when I click on a list item?
我有一个显示图像和名字以及 phone 号码的 recyclerview,当您单击该项目时我如何实现它会打开有关联系人的详细信息(图片、名字、姓氏、电话号码、电子邮件、备注)
我的适配器
class ContactsAdapter (private val context: Context, private val mContactsList: ArrayList<Contacts> = ArrayList())
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
fun setupContacts(contactsList: ArrayList<Contacts>) {
mContactsList.clear()
mContactsList.addAll(contactsList)
//search(query = "")
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layoutInflater: LayoutInflater = LayoutInflater.from(parent.context)
val itemView: View = layoutInflater.inflate(R.layout.inner_contact, parent, false)
return ContactsViewHolder(itemView = itemView)
}
override fun getItemCount(): Int {
return mContactsList.count()
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ContactsViewHolder) {
holder.bind(contactsModel = mContactsList[position])
}
}
class ContactsViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
var mContactIcon: CircleImageView = itemView.findViewById(R.id.contact_image)
var mContactFirstName: TextView = itemView.findViewById(R.id.contact_first_name)
var mContactPhone: TextView = itemView.findViewById(R.id.contact_phone)
//var mContactLastName: TextView = itemView.findViewById(R.id.contact_last_name)
fun bind(contactsModel: Contacts) {
contactsModel.images?.let { url ->
Picasso.with(itemView.context).load(url)
.placeholder(R.drawable.ic_person_placeholder)
.into(mContactIcon)
}
mContactFirstName.text = contactsModel.firstName
mContactPhone.text = contactsModel.phone
}
}
}
我的模型class
data class Contacts(
@SerializedName("firstName")
val firstName: String,
@SerializedName("lastName")
val lastName: String,
@SerializedName("phone")
val phone: String,
@SerializedName("email")
val email: String,
@SerializedName("notes")
val notes: String,
@SerializedName("images")
val images: String?
)
您必须在 bind()
方法中设置 onClickListener
fun bind(contactsModel: Contacts) {
itemView.setOnClickListener { showMoreInfo(contactsModel) }
...
}
因为视图被回收,当前模型将被传递给 onBindViewHolder
对于扩展的回收站视图,您可以像这样关注。
<LinearLayout
android:orientation="vertical">
<View
android:background="#D3D3D3"
android:id="@+id/item_divider" />
<TextView
android:id="@+id/item_title"
tools:text="Léon: The Professional" />
<LinearLayout
android:id="@+id/sub_item"
android:orientation="vertical">
<TextView
android:id="@+id/sub_item_genre"
tools:text="Genre: Crime, Drama, Thriller" />
<TextView
android:id="@+id/sub_item_year"
tools:text="Year: 1993" />
</LinearLayout> </LinearLayout>
Adapter.java
@Override
public void onBindViewHolder(RecViewHolder holder, int position) {
Movie movie = list.get(position);
// Set movie data
holder.bind(movie);
holder.itemView.setOnClickListener(v -> {
// Get the current state of the item
boolean expanded = movie.isExpanded();
// Change the state
movie.setExpanded(!expanded);
// Notify the adapter that item has changed
notifyItemChanged(position);
});
}
// Method in ViewHolder class
private void bind(Movie movie) {
// Get the state
boolean expanded = movie.isExpanded();
// Set the visibility based on state
subItem.setVisibility(expanded ? View.VISIBLE : View.GONE);
title.setText(movie.getTitle());
genre.setText("Genre: " + movie.getGenre());
year.setText("Year: " + movie.getYear());
}
Activity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
movieList = setupList();
RecAdapter adapter = new RecAdapter(movieList);
RecyclerView recyclerView = findViewById(R.id.recview);
// Removes blinks
((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
// Standard setup
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
}
我会添加一个带有一般示例的答案,也许有人需要它。为了正确操作,请确保您的 "Model" class 实现了 Serializable 或 Parcelable 接口(第二个似乎工作得更快)。 Class 型号:
data class Contacts(
@SerializedName("firstName")
val firstName: String,
@SerializedName("lastName")
val lastName: String,
@SerializedName("phone")
val phone: String,
@SerializedName("email")
val email: String,
@SerializedName("notes")
val notes: String,
@SerializedName("images")
val images: String?
) : Serializable
适配器:
class ContactsAdapter (private val context: Context, private val mContactsList: ArrayList<Contacts> = ArrayList())
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
fun setupContacts(contactsList: ArrayList<Contacts>) {
mContactsList.clear()
mContactsList.addAll(contactsList)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layoutInflater: LayoutInflater = LayoutInflater.from(parent.context)
val itemView: View = layoutInflater.inflate(R.layout.inner_contact, parent, false)
return ContactsViewHolder(itemView = itemView)
}
override fun getItemCount(): Int {
return mContactsList.count()
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ContactsViewHolder) {
holder.bind(contactsModel = mContactsList[position])
holder.itemView.setOnClickListener {
val contactsModel: Contacts = mContactsList[position]
val intent = Intent(context, DetailsActivity::class.java)
intent.putExtra("contact", contactsModel)
intent.flags = Intent.FLAG_ACTIVITY_NO_ANIMATION
context.startActivity(intent)
}
}
}
class ContactsViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
var mContactIcon: CircleImageView = itemView.findViewById(R.id.contact_image)
var mContactFirstName: TextView = itemView.findViewById(R.id.contact_first_name)
var mContactPhone: TextView = itemView.findViewById(R.id.contact_phone)
fun bind(contactsModel: Contacts) {
contactsModel.images?.let { url ->
Picasso.with(itemView.context).load(url)
.placeholder(R.drawable.ic_person_placeholder)
.into(mContactIcon)
}
mContactFirstName.text = contactsModel.firstName
mContactPhone.text = contactsModel.phone
}
}
}
第二个(接收)Activity:
class DetailsActivity : AppCompatActivity() {
private val TAG = "DetailsActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_details)
val clickedContact: Contacts = intent.getSerializableExtra("contact") as Contacts
details_first_name.text = clickedContact.firstName
details_last_name.text = clickedContact.lastName
details_phone.text = clickedContact.phone
details_email.text = clickedContact.email
details_notes.text = clickedContact.notes
Picasso.with(this@DetailsActivity).load(clickedContact.images).into(details_image)
}
}
我有一个显示图像和名字以及 phone 号码的 recyclerview,当您单击该项目时我如何实现它会打开有关联系人的详细信息(图片、名字、姓氏、电话号码、电子邮件、备注)
我的适配器
class ContactsAdapter (private val context: Context, private val mContactsList: ArrayList<Contacts> = ArrayList())
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
fun setupContacts(contactsList: ArrayList<Contacts>) {
mContactsList.clear()
mContactsList.addAll(contactsList)
//search(query = "")
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layoutInflater: LayoutInflater = LayoutInflater.from(parent.context)
val itemView: View = layoutInflater.inflate(R.layout.inner_contact, parent, false)
return ContactsViewHolder(itemView = itemView)
}
override fun getItemCount(): Int {
return mContactsList.count()
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ContactsViewHolder) {
holder.bind(contactsModel = mContactsList[position])
}
}
class ContactsViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
var mContactIcon: CircleImageView = itemView.findViewById(R.id.contact_image)
var mContactFirstName: TextView = itemView.findViewById(R.id.contact_first_name)
var mContactPhone: TextView = itemView.findViewById(R.id.contact_phone)
//var mContactLastName: TextView = itemView.findViewById(R.id.contact_last_name)
fun bind(contactsModel: Contacts) {
contactsModel.images?.let { url ->
Picasso.with(itemView.context).load(url)
.placeholder(R.drawable.ic_person_placeholder)
.into(mContactIcon)
}
mContactFirstName.text = contactsModel.firstName
mContactPhone.text = contactsModel.phone
}
}
}
我的模型class
data class Contacts(
@SerializedName("firstName")
val firstName: String,
@SerializedName("lastName")
val lastName: String,
@SerializedName("phone")
val phone: String,
@SerializedName("email")
val email: String,
@SerializedName("notes")
val notes: String,
@SerializedName("images")
val images: String?
)
您必须在 bind()
方法中设置 onClickListener
fun bind(contactsModel: Contacts) {
itemView.setOnClickListener { showMoreInfo(contactsModel) }
...
}
因为视图被回收,当前模型将被传递给 onBindViewHolder
对于扩展的回收站视图,您可以像这样关注。
<LinearLayout
android:orientation="vertical">
<View
android:background="#D3D3D3"
android:id="@+id/item_divider" />
<TextView
android:id="@+id/item_title"
tools:text="Léon: The Professional" />
<LinearLayout
android:id="@+id/sub_item"
android:orientation="vertical">
<TextView
android:id="@+id/sub_item_genre"
tools:text="Genre: Crime, Drama, Thriller" />
<TextView
android:id="@+id/sub_item_year"
tools:text="Year: 1993" />
</LinearLayout> </LinearLayout>
Adapter.java
@Override
public void onBindViewHolder(RecViewHolder holder, int position) {
Movie movie = list.get(position);
// Set movie data
holder.bind(movie);
holder.itemView.setOnClickListener(v -> {
// Get the current state of the item
boolean expanded = movie.isExpanded();
// Change the state
movie.setExpanded(!expanded);
// Notify the adapter that item has changed
notifyItemChanged(position);
});
}
// Method in ViewHolder class
private void bind(Movie movie) {
// Get the state
boolean expanded = movie.isExpanded();
// Set the visibility based on state
subItem.setVisibility(expanded ? View.VISIBLE : View.GONE);
title.setText(movie.getTitle());
genre.setText("Genre: " + movie.getGenre());
year.setText("Year: " + movie.getYear());
}
Activity.java
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
movieList = setupList();
RecAdapter adapter = new RecAdapter(movieList);
RecyclerView recyclerView = findViewById(R.id.recview);
// Removes blinks
((SimpleItemAnimator) recyclerView.getItemAnimator()).setSupportsChangeAnimations(false);
// Standard setup
recyclerView.setLayoutManager(new LinearLayoutManager(this));
recyclerView.setAdapter(adapter);
recyclerView.setHasFixedSize(true);
}
我会添加一个带有一般示例的答案,也许有人需要它。为了正确操作,请确保您的 "Model" class 实现了 Serializable 或 Parcelable 接口(第二个似乎工作得更快)。 Class 型号:
data class Contacts(
@SerializedName("firstName")
val firstName: String,
@SerializedName("lastName")
val lastName: String,
@SerializedName("phone")
val phone: String,
@SerializedName("email")
val email: String,
@SerializedName("notes")
val notes: String,
@SerializedName("images")
val images: String?
) : Serializable
适配器:
class ContactsAdapter (private val context: Context, private val mContactsList: ArrayList<Contacts> = ArrayList())
: RecyclerView.Adapter<RecyclerView.ViewHolder>() {
fun setupContacts(contactsList: ArrayList<Contacts>) {
mContactsList.clear()
mContactsList.addAll(contactsList)
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): RecyclerView.ViewHolder {
val layoutInflater: LayoutInflater = LayoutInflater.from(parent.context)
val itemView: View = layoutInflater.inflate(R.layout.inner_contact, parent, false)
return ContactsViewHolder(itemView = itemView)
}
override fun getItemCount(): Int {
return mContactsList.count()
}
override fun onBindViewHolder(holder: RecyclerView.ViewHolder, position: Int) {
if (holder is ContactsViewHolder) {
holder.bind(contactsModel = mContactsList[position])
holder.itemView.setOnClickListener {
val contactsModel: Contacts = mContactsList[position]
val intent = Intent(context, DetailsActivity::class.java)
intent.putExtra("contact", contactsModel)
intent.flags = Intent.FLAG_ACTIVITY_NO_ANIMATION
context.startActivity(intent)
}
}
}
class ContactsViewHolder(itemView: View): RecyclerView.ViewHolder(itemView) {
var mContactIcon: CircleImageView = itemView.findViewById(R.id.contact_image)
var mContactFirstName: TextView = itemView.findViewById(R.id.contact_first_name)
var mContactPhone: TextView = itemView.findViewById(R.id.contact_phone)
fun bind(contactsModel: Contacts) {
contactsModel.images?.let { url ->
Picasso.with(itemView.context).load(url)
.placeholder(R.drawable.ic_person_placeholder)
.into(mContactIcon)
}
mContactFirstName.text = contactsModel.firstName
mContactPhone.text = contactsModel.phone
}
}
}
第二个(接收)Activity:
class DetailsActivity : AppCompatActivity() {
private val TAG = "DetailsActivity"
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_details)
val clickedContact: Contacts = intent.getSerializableExtra("contact") as Contacts
details_first_name.text = clickedContact.firstName
details_last_name.text = clickedContact.lastName
details_phone.text = clickedContact.phone
details_email.text = clickedContact.email
details_notes.text = clickedContact.notes
Picasso.with(this@DetailsActivity).load(clickedContact.images).into(details_image)
}
}