Я бегу приложение, и я не могу обернуть мою голову вокруг, почему я получаю сообщение об ошибке, вот трассировки стекаAndroid Исключение нулевого указателя Использование ListView и фрагментов
E/AndroidRuntime: FATAL ИСКЛЮЧЕНИЕ: main Процесс: com.kozmiksoftware.swaggster, PID: 10428 java.lang.NullPointerException: попытка вызвать виртуальный метод 'void android.widget.TextView.setText (java.lang.CharSequence)' на нулевой ссылке объекта на com.kozmiksoftware.swaggster.ListView.RecyclerAdapter.onBindViewHolder (RecyclerAdapter.java:62) на android.support.v7.widget.RecyclerView $ Adapter.onBindViewH старше (RecyclerView.java:6279) на android.support.v7.widget.RecyclerView $ Adapter.bindViewHolder (RecyclerView.java:6312) на android.support.v7.widget.RecyclerView $ Recycler.tryBindViewHolderByDeadline (RecyclerView.java: 5258) в android.support.v7.widget.RecyclerView $ Recycler.tryGetViewHolderForPositionByDeadline (RecyclerView.java:5521) в android.support.v7.widget.RecyclerView $ Recycler.getViewForPosition (RecyclerView.java:5363) на андроиде. support.v7.widget.RecyclerView $ Recycler.getViewForPosition (RecyclerView.java:5359) на android.support.v7.widget.LinearLayoutManager $ LayoutState.next (LinearLayoutManager.java:2141) на android.support.v7.widget. LinearLayoutManager.layoutChunk (LinearLayoutManager.java:1525) на android.support.v7.widget.LinearLayoutManager.fill (LinearLayoutManager.java:1488) на android.support.v7.widget.LinearLayoutManager.scrollBy (LinearLayoutManager.java:1305) на android.support.v7.widget. LinearLayoutManager.scrollVerticallyBy (LinearLayoutManager.java:1050) на android.support.v7.widget.RecyclerView $ ViewFlinger.run (RecyclerView.java:4649) на android.view.Choreographer $ CallbackRecord.run (Choreographer.java:871) на android.view.Choreographer.doCallbacks (Хореограф.java:683) на android.view.Choreographer.doFrame (Хореограф.java:616) на android.view.Choreographer $ FrameDisplayEventReceiver.run (Хореограф.java:857) на android.os.Handler.handleCallback (Han dler.java:751) на android.os.Handler.dispatchMessage (Handler.java:95) на android.os.Looper.loop (Looper.java:154) на android.app.ActivityThread.main (ActivityThread. java: 6077) at java.lang.reflect.Method.invoke (собственный метод) at com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:865) at com.android.internal.os .ZygoteInit.main (ZygoteInit.java:755)
у меня есть фрагмент, который я пытаюсь добавить заголовок к ListView, я построил пользовательский адаптер и приведен ниже
public class RecyclerAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private static final int TYPE_HEADER = 0;
private static final int TYPE_ITEM = 1;
Header header;
List<ListItem> listItems;
public RecyclerAdapter(Header header, List<ListItem> listItems)
{
this.header = header;
this.listItems = listItems;
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
if(viewType == TYPE_HEADER)
{
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.header, parent, false);
return new VHHeader(v);
}
else if(viewType == TYPE_ITEM)
{
View v = LayoutInflater.from(parent.getContext()).inflate(R.layout.model, parent, false);
return new VHHeader(v);
}
throw new RuntimeException("There is no type that matches the type " + viewType + " + make sure your using types correctly");
}
private ListItem getItem(int position)
{
return listItems.get(position);
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if(holder instanceof VHHeader)
{
VHHeader VHheader = (VHHeader)holder;
VHheader.txtFullname.setText(header.getFullname());
VHheader.txtWeb.setText(header.getWeb());
VHheader.txtBio.setText(header.getBio());
VHheader.txtSwaggCount.setText(header.getSwaggCount());
VHheader.txtFollowerCount.setText(header.getFollowerCount());
VHheader.txtFollowingCount.setText(header.getFollowingCount());
}
else if(holder instanceof VHItem)
{
ListItem currentItem = getItem(position - 1);
VHItem VHItem = (VHItem)holder;
VHItem.txtName.setText(currentItem.getName());
VHItem.iv.setImageResource(currentItem.getId());
}
}
// Need to override this method
public int getItemViewType(int position) {
if(isPositionHeader(position))
return TYPE_HEADER;
return TYPE_ITEM;
}
private boolean isPositionHeader(int position){
return position == 0;
}
@Override
public int getItemCount() {
return listItems.size()+1;
}
private class VHHeader extends RecyclerView.ViewHolder {
TextView txtFullname;
TextView txtWeb;
TextView txtBio;
TextView txtSwaggCount;
TextView txtFollowerCount;
TextView txtFollowingCount;
public VHHeader(View itemView) {
super(itemView);
this.txtFullname = (TextView)itemView.findViewById(R.id.fullnameTV);
this.txtWeb = (TextView)itemView.findViewById(R.id.webTV);
this.txtBio= (TextView)itemView.findViewById(R.id.bioTV);
this.txtSwaggCount = (TextView)itemView.findViewById(R.id.swaggsCountTV);
this.txtFollowerCount = (TextView)itemView.findViewById(R.id.followerCountTV);
this.txtFollowingCount = (TextView)itemView.findViewById(R.id.followingCountTV);
}
}
private class VHItem extends RecyclerView.ViewHolder {
TextView txtName;
ImageView iv;
public VHItem(View itemView){
super(itemView);
this.txtName = (TextView)itemView.findViewById(R.id.txtName);
this.iv = (ImageView)itemView.findViewById(R.id.ivListItem);
}
}
}
А вот класс фрагмент
public class Posts extends Fragment {
private RecyclerView mPostRecyclerView;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
Bundle savedInstanceState) {
// Inflate the layout for this fragment
View rootView = inflater.inflate(R.layout.post, container, false);
mPostRecyclerView = (RecyclerView) rootView.findViewById(R.id.postListView);
mPostRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
RecyclerAdapter adapter = new RecyclerAdapter(getHeader(), getListItems());
mPostRecyclerView.setAdapter(adapter);
return rootView;
}
private Header getHeader()
{
ParseUser currentUser = ParseUser.getCurrentUser();
String fullname = (String) currentUser.get("fullname");
String bio = (String) currentUser.get("bio");
String web = (String) currentUser.get("web");
Header header = new Header();
header.setFullname(fullname);
header.setBio(bio);
header.setWeb(web);
header.setFollowerCount("1000");
header.setFollowingCount("1000");
header.setSwaggCount("1000");
return header;
}
public List<ListItem> getListItems()
{
List<ListItem> listItems = new ArrayList<ListItem>();
for (int i = 0; i<10; i++) {
ListItem item = new ListItem();
item.setName("image" + i);
if (i % 2 == 0)
item.setId(R.drawable.sweetlife);
else
item.setId(R.drawable.young);
listItems.add(item);
}
return listItems;
}
}
Это говорит об ошибке в onBindViewHolder() метод, я поставил точку останова и проверки адаптера и кажется чтобы я не мог найти нулевой объект, поэтому любая помощь была бы оценена.
Почему вы возвращаете 'VHHeader', когда тип элемента не является заголовком? –
Проверьте контрольные точки еще раз. 'VHheader.txtFullname', вероятно, null в какой-то момент –
Я дам попробовать, я следил за этим уроком, https://robusttechhouse.com/tutorial-how-to-add-header-to-recyclerview-in-android /, и он, похоже, работал –