Android 如何从RecyclerView获取子视图?

Android 如何从RecyclerView获取子视图?,android,android-recyclerview,Android,Android Recyclerview,我正在尝试通过位置获取子视图。单击一个项目时,我可以查看: rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() { @Override public void onItemClick(View view, int position) {

我正在尝试通过位置获取子视图。单击一个项目时,我可以查看:

rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getActivity(), new RecyclerItemClickListener.OnItemClickListener() {
        @Override
        public void onItemClick(View view, int position) {
            ((MainActivity) getActivity()).showSellRecordFragment(position, view);
        }
    }));
现在,如果没有单击,我无法获得子视图-例如,按位置:

rvSellRecords.someMagicalMethodWhichReturnsViewByPosition(5);
问题:如何从RecyclerView获取子视图?

为赏金编辑

我有
RecyclerView
来显示产品列表。当我点击它时,我正在添加新的片段,在其中我显示产品信息。打开时,我正在从
RecyclerView
更新工具栏视图-这工作正常:

    rvSellRecords.addOnItemTouchListener(new RecyclerItemClickListener(getContext(), new RecyclerItemClickListener.OnItemClickListener() {
                    @Override
                    public void onItemClick(View view, int position) {
                        sellPresenter.onSellRecordSelected(position, view);
                    }
                }));

    When I click blue button with "+", I am incrementing quantity by 1.





    public void onIncrementButtonClicked(){
                sellRecord.setCount(sellRecord.getCount() + 1);
                showQuantity();
                bus.post(new SellRecordChangedEvent(sellRecord, sellRecordPosition));
                }

Then I am posting updated sellRecord to first fragment using EventBus. There I am updating list data. I supposed that updating value(sell) automatically updates adapter. Now I am getting view from adapter using custom method(getView) which was created by me(you can find it below).



 @Subscribe
public void onEvent(SellRecordChangedEvent event){
    sell.getSellRecords().set(event.getSellRecordPosition(), event.getSellRecord());
    sell.recalculate();
    int position = event.getSellRecordPosition();
    View view = adapter.getView(position);
    bus.post(new TransactionTitleChangedEvent(null, view));
}

This is my adapter class - I changed adapter little bit to collect view in list and added method which returns view for respective position:



public class SellRecordsAdapter extends RecyclerView.Adapter<SellRecordsAdapter.ViewHolder> {

    .....
    .....
    .....
    List<View> viewList;

    public SellRecordsAdapter(List<SellRecord> sellRecordList) {

        .....

        viewList = new ArrayList<>();
    }

    .....
    .....
    .....

    @Override
    public void onBindViewHolder(ViewHolder viewHolder, int i) {

        .....
        .....
        .....

        viewList.add(i, viewHolder.itemView);

    }


    public View getView(int position){
        return viewList.get(position);
    }

}
rvSellRecords.addOnItemTouchListener(新的RecyclerItemClickListener(getContext(),新的RecyclerItemClickListener.OnItemClickListener()){
@凌驾
公共虚线单击(视图,int位置){
sellPresenter.onSellRecordSelected(位置、视图);
}
}));
当我单击带有“+”的蓝色按钮时,我将数量增加1。
public void onIncrementButtonClicked(){
sellRecord.setCount(sellRecord.getCount()+1);
showQuantity();
总线post(新的SellRecordChangedEvent(sellRecord,sellRecordPosition));
}
然后我使用EventBus将更新后的sellRecord发布到第一个片段。我正在更新列表数据。我认为更新值(sell)会自动更新适配器。现在,我使用我创建的自定义方法(getView)从适配器获取视图(您可以在下面找到它)。
@订阅
public void onEvent(SellRecordChangedEvent事件){
sell.getSellRecords().set(event.getSellRecordPosition(),event.getSellRecords());
sell.重新计算();
int position=event.getSellRecordPosition();
视图=适配器.getView(位置);
post(新事务标题changedevent(null,view));
}
这是我的适配器类-我稍微更改了适配器以收集列表中的视图,并添加了返回相应位置视图的方法:
公共类SellRecordsAdapter扩展了RecyclerView.Adapter{
.....
.....
.....
列表视图列表;
public SellRecordsAdapter(列表sellRecordList){
.....
viewList=newarraylist();
}
.....
.....
.....
@凌驾
公共无效onBindViewHolder(ViewHolder ViewHolder,int i){
.....
.....
.....
添加(i,viewHolder.itemView);
}
公共视图getView(内部位置){
返回viewList.get(位置);
}
}
我的问题:当我在工具栏中更新视图时,我得到的是旧视图。当数量为3时,我可以看到2。当数量为10时,视图为9

我的问题:如何使用项目的位置(无点击侦听器)从回收器视图中获取视图


在适配器中写入此方法

 public Object getItem(int position) {
        return yourArrayList.get(position);
    }
你只需要这样称呼它

yourAdapter.getItem(2);
通过你需要的职位。
希望它能解决您的问题。

您可以使用RecyclerView的LayoutManager

View view = layoutManager.findViewByPosition(position)

只要把这个方法放在你的代码中,你可以随意调用它

 void someMagicalMethodWhichReturnsViewByPosition(int position){
         //I assumes child views are CardView
         CardView c  = (CardView)rvSellRecords.getItem(int position);
         ///optional codes
         //////////
    }

现在我明白你的问题了。您需要为join recyclerview项目和活动使用接口。 必须定义如下所示的接口类:

public interface IViewClick {
    public void onClickButtonAdd();
}
将此参数添加到适配器类:

private IViewClick mListener;
并使用从输入中获取的值在构造函数中初始化它。 当用户单击加号按钮时,您通过此行将事件发送给活动:

 mListener.onClickButtonAdd();
在activity类中,必须实现IViewClick接口并在其中添加代码,如下所示:

@Override
    public void onClickButtonAdd() {
         ///  TODO every thing that you want.
         /// change your toolbar values.
    }
Handler handler = new Handler();        
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// rcv is my recyclerview
rcvStatus.getChildAt(1).setBackground(getActivity().getResources().getDrawable(R.drawable.disabled));
// or:
rcvStatus.getChildAt(1).setClickable(false);
}
}, 100);
这对你来说不是个好办法

RecyclerView.ViewHolder=
mRecyclerView.findViewHolderForItemId(mAdapter.getItemId(i))

使用
recyclerView.findviewholder进行布局位置(position)
reyclerView.findViewHolderForAdapterPosition(position)
获取用于position的viewholder。然后,您可以从viewholder访问任意子对象


签出

我不建议您自己跟踪视图列表。这可能会导致项目更新、职位更新等奇怪的问题

在SellRecordChangedEvent上,使用findViewHolderForAdapterPosition()而不是adapter.getView()


另外,最好在ViewHolder上的itemView上实现一个实际的ItemClick listener,而不是使用touch listener。网上有很多这样的例子。

那么recyclerview和您的产品信息分为两个不同的片段是吗?您希望recyclerview的视图在不在前台时更新吗?另外,您正在更改适配器数据项在位置
event.getSellRecordPosition()
处的数据,但您没有通过
adapter.notifyDataSetChanged()
或其他
notifyItemChanged(position)
方法通知适配器其数据集已更改

我将修改您的OneEvent(),如下所示:

在适配器上调用createViewHolder和下一个BindViewHolder肯定会更新该位置的视图,那么适配器.getView(位置)应该会返回最新的视图


这里MyViewHolder是您的viewholder类,yourRecyclerview是您的recycler视图的引用

我给出了一个答案,因为从RecyclerView中查找视图()非常复杂

@乔:花了4小时后,我找到了一个答案。这让我对索引有了正确的看法

mAdapter is adapter of RecyclerView        
View v = recyclerView.findViewHolderForItemId(mAdapter.getItemId(index/position)).itemView; 
现在只需通过以下方式访问您的视图:
v.findViewById(R.id.edittext)
或任何id

RecyclerView.ViewHolder holder = recycleView.findViewHolderForAdapterPosition(position);
ImageView imageView = holder.itemView.findViewById(R.id.iv_product);
这是对@Ravi Teja答案的补充。您可以使用特定项目的位置从recyclerView获取viewHolder,然后从viewHolder获取特定视图,如上图所示 我得到了空指针异常:

  • recyclerView.FindViewHolder进行自适应
  • recyclerView.findViewHolderForItemId
  • layoutManager.findViewByPosition
原因是这项工作稍有延误
RecyclerView.ViewHolder holder = recycleView.findViewHolderForAdapterPosition(position);
ImageView imageView = holder.itemView.findViewById(R.id.iv_product);
Handler handler = new Handler();        
mHandler.postDelayed(new Runnable() {
@Override
public void run() {
// rcv is my recyclerview
rcvStatus.getChildAt(1).setBackground(getActivity().getResources().getDrawable(R.drawable.disabled));
// or:
rcvStatus.getChildAt(1).setClickable(false);
}
}, 100);