【问题标题】:How do I show full information when I click on a list item?单击列表项时如何显示完整信息?
【发布时间】:2020-01-04 20:42:02
【问题描述】:

我有一个显示图像和名字和电话号码的回收视图,我如何实现当您单击该项目时会打开有关联系人的详细信息(图片、名字、姓氏、号码、电子邮件、注释)

我的适配器

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

我的模型课

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

【问题讨论】:

    标签: android android-studio android-recyclerview android-adapter


    【解决方案1】:

    你必须在bind()方法中设置onClickListener

    fun bind(contactsModel: Contacts) {
         itemView.setOnClickListener { showMoreInfo(contactsModel) }
    ...
    }
    

    因为视图被回收,当前模型将被传递给onBindViewHolder

    【讨论】:

      【解决方案2】:

      对于扩展的回收站视图,您可以像这样关注。

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

      【讨论】:

        【解决方案3】:

        我将添加一个带有一般示例的答案,也许有人会需要它。为了正确操作,请确保您的“模型”类实现了 Serializable 或 Parcelable 接口(第二个似乎工作得更快)。类模型:

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

        【讨论】:

          猜你喜欢
          • 2020-06-28
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-01-02
          • 1970-01-01
          相关资源
          最近更新 更多