[英]Get ViewHolder for specific position - RecyclerView
我需要获取特定位置的观察者,但出现此错误:
java.lang.NullPointerException:尝试从空对象引用中读取字段“ android.view.View android.support.v7.widget.RecyclerView $ ViewHolder.itemView”
这是我的适配器:
public class ConciergeAdapter extends RecyclerView.Adapter<ConciergeAdapter.MyViewHolder> {
private Context context;
private ArrayList<String> items;
public class MyViewHolder extends RecyclerView.ViewHolder
{
public TextView text;
public RelativeLayout maincon;
public MyViewHolder(View view) {
super(view);
this.text = (TextView) view.findViewById(R.id.text);
this.maincon = (RelativeLayout) view.findViewById(R.id.maincon);
}
}
public ConciergeAdapter(Context context, ArrayList<String> items)
{
this.context = context;
this.items = items;
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType)
{
View itemView = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_concierge_top_items, parent, false);
return new MyViewHolder(itemView);
}
@Override
public void onBindViewHolder(ConciergeAdapter.MyViewHolder holder, int position)
{
Random rnd = new Random();
int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
holder.maincon.setBackgroundColor(color);
}
@Override
public int getItemCount() {
return items.size();
}
}
这是我调用适配器并尝试获取ViewHolder的代码:
final LinearLayoutManager layoutManager= new LinearLayoutManager(getActivity(),LinearLayoutManager.HORIZONTAL, false);
mRecyclerView = (RecyclerView) view.findViewById(R.id.recycler_view);
mRecyclerView.setLayoutManager(layoutManager);
ArrayList<String> itemslist = new ArrayList<String>();
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
itemslist.add("1");
ConciergeAdapter adapter = new ConciergeAdapter(getActivity(),itemslist);
mRecyclerView.setAdapter(adapter);
//RecyclerView.ViewHolder viewholder = mRecyclerView.findViewHolderForAdapterPosition(1);
View holder = layoutManager.getChildAt(0);
RelativeLayout middle = (RelativeLayout) holder.findViewById(R.id.maincon);
middle.getLayoutParams().height = 200;
发生这种情况是因为尚未填充RecyclerView
。 我建议您在适配器的onBindViewHolder
中执行预期的布局操作:
@Override
public void onBindViewHolder(ConciergeAdapter.MyViewHolder holder, int position) {
if (position == 0) {
RelativeLayout middle = (RelativeLayout) holder.container(R.id.maincon);
middle.getLayoutParams().height = 200;
}
Random rnd = new Random();
int color = Color.argb(255, rnd.nextInt(256), rnd.nextInt(256), rnd.nextInt(256));
holder.maincon.setBackgroundColor(color);
}
您的MyViewHolder
:
public class MyViewHolder extends RecyclerView.ViewHolder {
public View container;
public TextView text;
public RelativeLayout maincon;
public MyViewHolder(View view) {
super(view);
container = view;
this.text = (TextView) view.findViewById(R.id.text);
this.maincon = (RelativeLayout) view.findViewById(R.id.maincon);
}
}
我的想法是将ViewHolders出现在适配器中的数组中。
尝试像这样扩展RecyclerView.Adapter:
public class MyRecyclerViewAdapter extends RecyclerView.Adapter<...> {
...
// array of ViewHolders at specific positions
private ViewHolder[] viewHolders;
// constructor
public MyRecyclerViewAdapter(List items) {
...
viewHolders = new ViewHolder[items.size()];
...
}
@Override
public void onBindViewHolder(final ViewHolder holder, int position) {
...
viewHolders[position] = holder;
...
}
// call this function from outside of the adapter
public ViewHolder getViewHolder(int position) {
return viewHolders[position];
}
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.