0

Я пытаюсь следовать этот учебник, чтобы реализовать ListView адаптер:Создание ListView адаптера дает ошибку

https://github.com/codepath/android_guides/wiki/Using-an-ArrayAdapter-with-ListView

Однако, когда я бегу мое приложение, я получаю следующее сообщение об ошибке:

Unable to start activity ComponentInfo{com.john.test/com.john.test.MainActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference

MainActivity.java

package com.john.test; 

import android.content.Context; 
import android.net.Uri; 
import android.support.v4.app.Fragment; 
import android.support.v4.app.FragmentManager; 
import android.support.v4.app.FragmentPagerAdapter; 
import android.support.v4.view.ViewPager; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.LayoutInflater; 
import android.view.Menu; 
import android.view.MenuItem; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.BaseAdapter; 
import android.widget.ListView; 
import android.widget.TextView; 

import com.astuetz.PagerSlidingTabStrip; 
import com.nostra13.universalimageloader.core.DisplayImageOptions; 
import com.nostra13.universalimageloader.core.ImageLoader; 
import com.nostra13.universalimageloader.core.ImageLoaderConfiguration; 
import com.nostra13.universalimageloader.core.display.RoundedBitmapDisplayer; 
import com.john.test.API.ApiEndpointInterface; 
import com.john.test.models.Post; 

import java.util.ArrayList; 
import java.util.List; 

import retrofit.Callback; 
import retrofit.RestAdapter; 
import retrofit.RetrofitError; 
import retrofit.client.Response; 

public class MainActivity extends AppCompatActivity 
    implements TrendingFragment.OnFragmentInteractionListener, 
     HotFragment.OnFragmentInteractionListener, 
     NewFragment.OnFragmentInteractionListener { 

    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar); 
     setSupportActionBar(toolbar); 

     // Initialize the ViewPager and set an adapter 
     ViewPager pager = (ViewPager) findViewById(R.id.pager); 
     pager.setAdapter(new PagerAdapter(getSupportFragmentManager())); 

     // Bind the tabs to the ViewPager 
     PagerSlidingTabStrip tabs = (PagerSlidingTabStrip) findViewById(R.id.tabs); 
     tabs.setViewPager(pager); 

     // Construct the data source 
     ArrayList<Post> arrayOfUsers = new ArrayList<Post>(); 
     // Create the adapter to convert the array to views 
     PostAdapter adapter = new PostAdapter(this, arrayOfUsers); 
     // Attach the adapter to a ListView 
     ListView listView = (ListView) findViewById(R.id.listview_posts); 
     listView.setAdapter(adapter); 
    } 

    @Override 
    public boolean onCreateOptionsMenu(Menu menu) { 
     // Inflate the menu; this adds items to the action bar if it is present. 
     getMenuInflater().inflate(R.menu.menu_main, menu); 
     return true; 
    } 

    @Override 
    public boolean onOptionsItemSelected(MenuItem item) { 
     // Handle action bar item clicks here. The action bar will 
     // automatically handle clicks on the Home/Up button, so long 
     // as you specify a parent activity in AndroidManifest.xml. 
     int id = item.getItemId(); 

     //noinspection SimplifiableIfStatement 
     if (id == R.id.action_settings) { 
      return true; 
     } 

     return super.onOptionsItemSelected(item); 
    } 

    public void onFragmentInteraction(Uri uri){ 
     // 
    } 

    class PagerAdapter extends FragmentPagerAdapter { 

     private final String[] TITLES = {"Trending", "Hot", "New"}; 

     public PagerAdapter(FragmentManager fm) { 
      super(fm); 
     } 

     @Override 
     public CharSequence getPageTitle(int position) { 
      return TITLES[position]; 
     } 

     @Override 
     public int getCount() { 
      return TITLES.length; 
     } 

     @Override 
     public Fragment getItem(int position) { 
      switch (position) { 
       case 0: 
        return new TrendingFragment(); 
       case 1: 
        return new HotFragment(); 
       case 2: 
        return new NewFragment(); 
      } 

      return null; 
     } 
    } 
} 

PostAdapter.java

package com.john.test; 

import android.content.Context; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ArrayAdapter; 
import android.widget.TextView; 

import com.john.test.models.Post; 

import java.util.ArrayList; 

public class PostAdapter extends ArrayAdapter<Post> { 

    public PostAdapter(Context context, ArrayList<Post> users) { 
     super(context, 0, users); 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     // Get the data item for this position 
     Post user = getItem(position); 
     // Check if an existing view is being reused, otherwise inflate the view 
     if (convertView == null) { 
      convertView = LayoutInflater.from(getContext()).inflate(R.layout.post_layout, parent, false); 
     } 
     // Lookup view for data population 
     TextView tvName = (TextView) convertView.findViewById(R.id.post_message); 
     // Populate the data into the template view using the data object 
     tvName.setText(user.message); 
     // Return the completed view to render on screen 
     return convertView; 
    } 

} 

Post.java

package com.john.test.models; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Post { 

    public String message; 

    public String getMessage() { 
     return message; 
    } 

    public void setMessage(String message) { 
     this.message = message; 
    } 

} 

post_layout.xml

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent"> 

    <android.support.v7.widget.CardView 
     xmlns:card_view="http://schemas.android.com/apk/res-auto" 
     android:id="@+id/card_view" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="5dp" 
     card_view:cardCornerRadius="2dp" 
     card_view:cardElevation="1dp" 
     card_view:cardBackgroundColor="@color/white"> 

     <TextView 
      android:id="@+id/post_message" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:text="Lorem ipsum" 
      /> 

    </android.support.v7.widget.CardView> 
</LinearLayout> 

fragment_trending.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" 
    android:layout_height="match_parent" tools:context="com.john.test.TrendingFragment"> 

    <ListView 
     android:id="@+id/listview_posts" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 
    </ListView> 

</LinearLayout> 

activity_main.xml

<LinearLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:orientation="vertical" 
    android:fitsSystemWindows="true" 
    tools:context=".MainActivity"> 

    <include layout="@layout/toolbar" /> 

    <com.astuetz.PagerSlidingTabStrip 
     android:id="@+id/tabs" 
     android:layout_width="match_parent" 
     android:layout_height="48dp" 
     android:layout_below="@+id/toolbar" 
     android:background="@color/primary" 
     android:textColorPrimary="@color/white" 
     app:pstsDividerColor="@color/primary" 
     app:pstsIndicatorColor="@color/white" 
     app:pstsIndicatorHeight="2dp" 
     app:pstsShouldExpand="true" 
     app:pstsUnderlineHeight="0dp" 
     app:pstsTabTextSize="12dp" 
     /> 

    <android.support.v4.view.ViewPager 
     android:id="@+id/pager" 
     android:layout_width="match_parent" 
     android:layout_height="0dp" 
     android:layout_weight="1" 
     android:layout_below="@+id/tabs" 
     /> 
</LinearLayout> 

toolbar.xml

<?xml version="1.0" encoding="utf-8"?> 
<android.support.v7.widget.Toolbar xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:app="http://schemas.android.com/apk/res-auto" 
    android:id="@+id/toolbar" 
    app:theme="@style/ThemeOverlay.AppCompat.ActionBar" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:minHeight="?attr/actionBarSize" 
    android:background="@color/primary" /> 

TrendingFragment.java

package com.john.test; 

import android.app.Activity; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.v4.app.Fragment; 
import android.view.LayoutInflater; 
import android.view.View; 
import android.view.ViewGroup; 
import android.widget.ListView; 

import com.john.test.models.Post; 

import java.util.ArrayList; 


/** 
* A simple {@link Fragment} subclass. 
* Activities that contain this fragment must implement the 
* {@link TrendingFragment.OnFragmentInteractionListener} interface 
* to handle interaction events. 
* Use the {@link TrendingFragment#newInstance} factory method to 
* create an instance of this fragment. 
*/ 
public class TrendingFragment extends Fragment { 
    // TODO: Rename parameter arguments, choose names that match 
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER 
    private static final String ARG_PARAM1 = "param1"; 
    private static final String ARG_PARAM2 = "param2"; 

    // TODO: Rename and change types of parameters 
    private String mParam1; 
    private String mParam2; 

    private OnFragmentInteractionListener mListener; 

    /** 
    * Use this factory method to create a new instance of 
    * this fragment using the provided parameters. 
    * 
    * @param param1 Parameter 1. 
    * @param param2 Parameter 2. 
    * @return A new instance of fragment TrendingFragment. 
    */ 
    // TODO: Rename and change types and number of parameters 
    public static TrendingFragment newInstance(String param1, String param2) { 
     TrendingFragment fragment = new TrendingFragment(); 
     Bundle args = new Bundle(); 
     args.putString(ARG_PARAM1, param1); 
     args.putString(ARG_PARAM2, param2); 
     fragment.setArguments(args); 
     return fragment; 
    } 

    public TrendingFragment() { 
     // Required empty public constructor 
    } 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     if (getArguments() != null) { 
      mParam1 = getArguments().getString(ARG_PARAM1); 
      mParam2 = getArguments().getString(ARG_PARAM2); 
     } 
    } 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
          Bundle savedInstanceState) { 
     // Inflate the layout for this fragment 

     View view = inflater.inflate(R.layout.fragment_trending, container, false); 
     ListView listView = (ListView) view.findViewById(R.id.listview_posts); 

     // Construct the data source 
     ArrayList<Post> arrayOfUsers = new ArrayList<Post>(); 

     Post post1 = new Post("Hey"); 
     arrayOfUsers.add(post1); 

     // Create the adapter to convert the array to views 
     PostAdapter adapter = new PostAdapter(getActivity(), arrayOfUsers); 
     // Attach the adapter to a ListView 
     listView.setAdapter(adapter); 

     // return inflater.inflate(R.layout.fragment_trending, container, false); 
    } 

    // TODO: Rename method, update argument and hook method into UI event 
    public void onButtonPressed(Uri uri) { 
     if (mListener != null) { 
      mListener.onFragmentInteraction(uri); 
     } 
    } 

    @Override 
    public void onAttach(Activity activity) { 
     super.onAttach(activity); 
     try { 
      mListener = (OnFragmentInteractionListener) activity; 
     } catch (ClassCastException e) { 
      throw new ClassCastException(activity.toString() 
        + " must implement OnFragmentInteractionListener"); 
     } 
    } 

    @Override 
    public void onDetach() { 
     super.onDetach(); 
     mListener = null; 
    } 

    /** 
    * This interface must be implemented by activities that contain this 
    * fragment to allow an interaction in this fragment to be communicated 
    * to the activity and potentially other fragments contained in that 
    * activity. 
    * <p/> 
    * See the Android Training lesson <a href= 
    * "http://developer.android.com/training/basics/fragments/communicating.html" 
    * >Communicating with Other Fragments</a> for more information. 
    */ 
    public interface OnFragmentInteractionListener { 
     // TODO: Update argument type and name 
     public void onFragmentInteraction(Uri uri); 
    } 

} 

В чем причина ошибки и как ее исправить? Я считаю, что это имеет какое-то отношение к моей реализации Fragment, но я не уверен.

+0

Что такое 'R.id.pager'? – tachyonflux

+0

Используется для этой библиотеки (tabbing library): https://github.com/jpardogo/PagerSlidingTabStrip – user5213051

+0

Итак, ваш 'ListView' находится в вашем' TrendingFragment'. Вы должны получить доступ к нему в '' OnCreateView() 'TrendingFragment'. – tachyonflux

ответ

1

Вы помещаете ListView в макет, который не завышен.

Изменение этой линии

setContentView(R.layout.activity_main); 

в

setContentView(R.layout.fragment_trending); 

Вы должны переместить ListView в TrendingFragment и установить ListAdaper внутри фрагмента.

Я не знаю, как вы реализуете фрагмент, но он должен выглядеть примерно так.

TrendingFragment

public class TrendingFragment extends Fragmnet { 

    public View onCreateView(LayoutInflater inflater, ViewGroup container, 
      Bundle savedInstanceState) { 
     View view = inflater.inflate(R.layout.fragment_trending, container, false); 
     ListView listView = (ListView) findViewById(R.id.listview_posts); 

     // Construct the data source 
     ArrayList<Post> arrayOfUsers = new ArrayList<Post>(); 
     // Create the adapter to convert the array to views 
     PostAdapter adapter = new PostAdapter(this, arrayOfUsers); 
     // Attach the adapter to a ListView 
     listView.setAdapter(adapter); 
     return view; 
    } 
} 
+0

Ошибка 'java.lang.NullPointerException: попытка вызвать виртуальный метод 'java.lang.CharSequence android.support.v7.widget.Toolbar.getTitle()' в ссылке нулевого объекта' – user5213051

+1

Вы должны поместить панель инструментов в фрагмент_требу. Опубликуйте весь свой макет и код. Вы хотите пейджер, который содержит кучу ListViews? –

+0

Я добавил остальные макеты. – user5213051

0

Во всяком случае, точка, расположение прикреплении к MainActivity через setContentView() не включает в себя ListView.

ListView listView = (ListView) findViewById(R.id.listview_posts); 

этот findViewById метод возвращает null.

Попробуйте получить доступ к элементу ListView через фрагмент.

Смежные вопросы