[英]Getting a Reference to ViewHolder on RecyclerView Click
這是我實現RecyclerView
第一次嘗試。 我已經在Adapter
和ViewHolder
類之間實現了Callback
接口,以處理UI元素(按鈕)上的Click事件。 我在獲取對單擊發生的ViewHolder
的引用時遇到了問題。我可以單擊列表中第一項的Button
,但是我定義的操作是在回收者視圖中的最后一個viewholder
上執行的。 我終於想通了通過我的界面的位置,但我正在努力了解如何從中獲取對該視圖持有者的引用。
public class RoomAdapter extends RecyclerView.Adapter<RoomAdapter.RoomViewHolder>
{
List<Room> mRooms;
public RoomAdapter(List<Room> rooms) {
mRooms = rooms;
}
@Override
public RoomViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
final View viewItem = LayoutInflater
.from(viewGroup.getContext())
.inflate(R.layout.room_rv_item,viewGroup,false);
return vh = new RoomViewHolder(viewItem,new IRoomViewClick() {
@Override
public void editname(int pos) {
}
});
}
@Override
public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) {
Room r = getItem(i);
roomViewHolder.label.setText(r.name);
}
public Room getItem(int position)
{
return mRooms.get(position);
}
@Override
public long getItemId(int position) {
return mRooms.get(position).getId();
}
@Override
public int getItemCount() {
return mRooms.size();
}
public static class RoomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener
{
TextView label;
Button editBtn;
LinearLayout labelView;
Button saveBtn;
Button deleteBtn;
EditText editNameET;
IRoomViewClick mListener;
public RoomViewHolder(View itemView, IRoomViewClick listener) {
super(itemView);
labelView = (LinearLayout) itemView.findViewById(R.id.labelview);
mListener = listener;
editBtn =(Button) itemView.findViewById(R.id.editbtn);
editBtn.setOnClickListener(this);
label = (TextView) itemView.findViewById(R.id.room_listitem_label);
}
@Override
public void onClick(View view) {
int pos = getPosition();
mListener.editname(pos);
}
}
public static interface IRoomViewClick
{
public void editname(int pos);
}
}
你可以設置一個標簽editBtn
在onBindViewHolder
:
public RoomViewHolder(View itemView, IRoomViewClick listener) {
....
editBtn =(Button) itemView.findViewById(R.id.editbtn);
//add tag for this view
editBtn.setTag(this);
....
}
並將其放入onClick
@Override
public void onClick(View view) {
//getTag
RoomViewHolder holder = (RoomViewHolder )(view.getTag());
int pos = getPosition();
mListener.editname(pos);
...
}
實際上,通過在RecyclerView上調用getChildViewHolder(View child)
,您可以比getTag
做得更好:
@Override
public void onClick(View v) {
MyHolder holder = (MyHolder) mRecyclerView.getChildViewHolder(v);
holder.textView.setText("Clicked!");
}
@Override
public void onClick(View v) {
int pos = getAdapterPosition(); //getPosition() is deprecated
notifyItemChanged(pos);
}
notifyItemChanged將通知您的onBindViewHolder,然后您可以執行以下操作
public void onBindViewHolder(RoomViewHolder roomViewHolder, int i) {
Room r = getItem(i);
roomViewHolder.label.setText(r.name);
if(i == pos){ // Do Something }
}
每當您單擊該項目時,它都會更改pos的值並觸發//做某事
RecycleView
證明, RecycleView
將視圖位置保存在視圖布局參數中,因此,如果您只希望視圖位置從列表中獲取正確的項目,則可以使用以下方法:
RecyclerView.LayoutParams lp = (RecyclerView.LayoutParams) v.getLayoutParams();
lp.getViewPosition();
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.