这是我第一次尝试实现RecyclView
。我在Adapter
和ViewHolder
类之间实现了一个Callback
接口来处理UI元素(按钮)上的点击事件。我在获取对发生单击的ViewHolder
的引用时遇到问题。我可以单击列表中第一个项目的Button
,但是我定义的操作是在我的回收器视图中的最后一个viewwhold
上执行的。我终于想出了通过我的界面传递这个位置,但是我很难理解如何从它那里获得对那个查看者的引用。
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);
}
}
@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 '值,并触发//做一些事情
实际上,您可以通过在RecyclView上调用getChildViewHolder(View child)
来做得比getTag
更好:
@Override
public void onClick(View v) {
MyHolder holder = (MyHolder) mRecyclerView.getChildViewHolder(v);
holder.textView.setText("Clicked!");
}
您可以在onBindViewHolder
中为editBtn
设置标签:
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。对于第一个选项卡,它显示得很好,但是当我滑动到第二个选项卡然后又回到第一个选项卡时,出现以下错误: java.lang.NullPointerException:尝试在空对象引用上调用虚拟方法“ void android.support.v7.widget.RecyclerView $ LayoutManager.stopSmoothSc
我正试图使用cardview显示RecycerView的联系人,但我得到了这个错误:
我正在OnItemClickListener接口的OnItemClicked(int position,view v)方法中传递position和view。现在,在我的ViewReceptionistActivity中,我要检查单击了哪个项和哪个子部分。如果用户单击图像,则执行任务A,如果用户单击名称,则执行任务B,依此类推。 下面是我的布局文件-viewreceptionist_item.xml
问题内容: 在Swift 1.2中,有一个Set对象,可用于创建静态类型的Set。 我无法找到如何在某个索引处获取对象。它具有,您可以执行以下操作:。 这将检索到该对象。但是现在我想从某个索引中获取一个对象。 但是,如何创建具有特定“索引”的SetIndex? 问题答案: Swift 3及更高版本 您可以从: Swift 2(已淘汰) 您可以从: Swift 1.x(已淘汰) 与相似,您必须从:
问题内容: 如果知道与该线程关联的ID,该如何获取正在运行的线程的引用? 例如 问题答案: 您有2种方法可以做到。两者都很简单: 旧方法:获取您可以循环访问..getParent()的根线程组。并打电话 较新(但速度较慢)。 第一种方法有一个小问题,由于存在错误,ThreadGroup可能根本无法枚举任何东西。 第二个比较慢,但是有安全漏洞。
我面临以下问题:我的类继承了。这个工作器的逻辑足够复杂,事实上调用了里面的一堆其他例程并捕获()几个的结果,例如: 问题: 我可以以某种方式将收集的值(值是简单的原始对象)返回/放置给? 或者作为一种选择-我如何在其他类中收听/收集这些-在我的之外? 因为,