单击列表项时如何显示完整信息?

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)
    }
}