0

나는 구매자 목록을보고 하나를 선택하기 위해 안드로이드 아키텍처 구성 요소를 구현 중이다.livedata recyclerview with checkbox

여기 내 구매자 엔티티

@Entity 
data class Buyer(@PrimaryKey var id: Long = 0, var name: String = "", var photo: String = "", var address: String = "", 
       @Ignore var isSelected: Boolean = false, 
       @SerializedName("last_update_time") var lastUpdateTime: Long = 0L) { 

} 

내가 삽입 recyclerview에 표시 한 것입니다.

내가 원하는 것은 구매자 한 명을 클릭 할 때 특정 구매자를 어떻게 표시 할 수 있는지 알고 싶습니다.

한 구매자를 클릭하면 이전에 선택한 구매자가 선택을 취소해야합니다.

구현을 도와주세요. 여기에 편집

class BuyerAdapter(private var buyers: ArrayList<Buyer>, private val listener: View.OnClickListener) : RecyclerView.Adapter<BuyerViewHolder>() { 


    override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): BuyerViewHolder { 
     val v = LayoutInflater.from(parent.context).inflate(
       R.layout.item_buyer, parent, false) 
     return BuyerViewHolder(v) 
    } 

    override fun onBindViewHolder(holder: BuyerViewHolder, position: Int) { 
     bindView(holder, position) 
    } 

    private fun bindView(holder: BuyerViewHolder, position: Int) { 
     val buyer = buyers[position] 
     holder.setName(buyer.name) 
     holder.setAddress(buyer.address) 
     holder.loadImage(ServiceHandler.BASE_URL + buyer.photo) 
     if (buyer.isSelected) { 
      holder.setCardColor(R.color.waveBlue) 
      holder.setNameColor(R.color.white) 
      holder.setAddressColor(R.color.white) 
     } else { 
      holder.setCardColor(R.color.white) 
      holder.setNameColor(R.color.contentGrey) 
      holder.setAddressColor(R.color.contentGreyDesc) 
     } 
     holder.itemView.tag = buyer 
     holder.itemView.setOnClickListener(listener) 
    } 

    override fun getItemCount(): Int = buyers.size 
    fun refresh(newBuyers: ArrayList<Buyer>) { 
     this.buyers = newBuyers 
     notifyDataSetChanged() 
    } 
} 

그리고

내가 recyclerview에서 데이터를 추가하는 방법을 여기 내 어댑터 XML 항목

<?xml version="1.0" encoding="utf-8"?><!--<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"--><!--xmlns:card_view="http://schemas.android.com/apk/res-auto"--><!--android:layout_width="match_parent"--><!--android:layout_height="191dp"--><!--android:paddingTop="13dp"--><!--&gt;--> 

<android.support.v7.widget.CardView xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:card_view="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/buyer_card" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:layout_marginLeft="8dp" 
    android:layout_marginRight="8dp" 
    android:layout_marginTop="4dp" 
    android:clickable="true" 
    card_view:cardCornerRadius="2dp" 
    card_view:cardElevation="4dp" 
    card_view:cardPreventCornerOverlap="true"> 

    <android.support.constraint.ConstraintLayout 
     android:id="@+id/rlBuyerBack" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:padding="4dp"> 
     ​ 

     <de.hdodenhof.circleimageview.CircleImageView 
      android:id="@+id/ivLogo" 
      android:layout_width="40dp" 
      android:layout_height="40dp" 
      android:scaleType="centerCrop" 
      android:src="@drawable/placeholder_profile_photo" 
      card_view:layout_constraintBottom_toBottomOf="parent" 
      card_view:layout_constraintLeft_toLeftOf="parent" 
      card_view:layout_constraintTop_toTopOf="parent" /> 

     <in.motiontech.wave.helper.WaveTextView 
      android:id="@+id/tvName" 
      style="@style/semiBoldFont" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_marginLeft="8dp" 
      android:text="Name" 
      android:textColor="@color/contentGrey" 
      android:textSize="@dimen/tSizeHeader" 
      card_view:layout_constraintLeft_toRightOf="@+id/ivLogo" 
      card_view:layout_constraintTop_toTopOf="@+id/ivLogo" /> 


     <in.motiontech.wave.helper.WaveTextView 
      android:id="@+id/tvAddress" 
      style="@style/regularFont" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignStart="@id/tvName" 
      android:layout_below="@+id/tvName" 
      android:layout_marginLeft="8dp" 
      android:layout_marginTop="2dp" 
      android:text="Address" 
      android:textColor="@color/contentGrey" 
      android:textSize="@dimen/tSizeDesc" 
      card_view:layout_constraintLeft_toRightOf="@+id/ivLogo" 
      card_view:layout_constraintTop_toBottomOf="@+id/tvName" /> 
    </android.support.constraint.ConstraintLayout> 

</android.support.v7.widget.CardView> 

편집 2 입니다

viewModel.getBuyers().observe(this, Observer<List<Buyer>> { 
      if (it != null) { 
       if (it.isEmpty()) { 
        showProgress() 
        if (CommonUtils.isInNetwork(this)) { 
         viewModel.getBuyerList() 
        } else { 
         CommonUtils.showNoInternetDialog(this) 
        } 
       } else { 
        hideProgress() 
        buyerAdapter?.refresh(ArrayList(it)) 
       } 
      } 
     }) 
+0

을 사용하고 같은

fun selectBuyer(buyer: Buyer?) { if (buyer == null) return buyers.value?.filter { it != buyer }?.forEach { it.isSelected = false } buyers.value?.get(buyers.value!!.indexOf(buyer))?.isSelected = true newBuyer = buyer } 

나는 당신이 어댑터의 항목에 대한 어댑터 및 XML을 게시해야한다고 생각, notifyupdate 할 필요가 없습니다 확인할 수 있습니다. –

+0

내 편집 –

+0

을 확인하고 for 루프를 넣고 다른 항목을 선택 취소하고 특정 항목을 선택한 다음'notifyDatasetChanged()'를 호출하십시오. 간단하지만 효과적입니다. – Godwin

답변

0

뭐 내가 한 일은 내가 livedata의 가치를 갱신했다는 것입니다. 당신은 코드 아래에 볼 수 있습니다 : 나는 관찰자 패턴