[英]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.