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