2016-10-15 72 views
0

我尝试将Customer适配器设置为ListView,但始终收到NullException。 这是我的适配器:无法将自定义适配器设置为ListView

public class MovieAdapter extends BaseAdapter{ 
    private Context mContext; 
    // Add mVar of resource, an array for example 
    private List<Movie> mMovies; 



    // Automatically create constructor for all mVar 


    public MovieAdapter(Context context, List<Movie> movies) { 
     mContext = context; 
     mMovies = movies; 
    } 

    public MovieAdapter(Callback<NowPlaying> callback, List<Movie> movies) { 
    } 


    // Automatically create required methods and override them with mVar 
    @Override 
    public int getCount() { 
     return mMovies.size(); 
    } 

    @Override 
    public Object getItem(int position) { 
     return mMovies.get(position); 
    } 

    @Override 
    public long getItemId(int position) { 
     return 0; // Use to easier get position reference 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 

     if (convertView == null) { 
      // If the ListView is brand new 

      convertView = LayoutInflater.from(mContext).inflate(R.layout.list_movie_item, 
        parent, false); 
      // Get layout from the context and inflate it the daily_list_item. 

      // Use ViewHolder to create smooth scrolling list 

      holder = new ViewHolder(convertView); 

      // Set the tag for reuse the View 
      convertView.setTag(holder); 

     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     //Set content to holderVar from get 
     //Create the ModelClass object as an element in the array 
     // Remember even the Image need to be set (different from MainAct) 
     Movie movie = mMovies.get(position); 
     holder.mTvLeftTitle.setText(movie.getTitle()); 
     holder.mTvLeftOverview.setText(movie.getOverview()); 
//  holder.mTvLeftCast.setText(movie.getCast()); 
     Glide.with(mContext) 
       .load(movie.getPosterPath()) 
       .into(holder.mImgLeftPoster); 

     holder.mTvRightTitle.setText(movie.getTitle()); 
     holder.mTvRightOverview.setText(movie.getOverview()); 
//  holder.mTvLeftCast.setText(movie.getCast()); 
     Glide.with(mContext) 
       .load(movie.getPosterPath()) 
       .into(holder.mImgRightPoster); 


     return convertView; 
    } 

    // Create class ViewHolder with Widget as variable based on Model class 
    static class ViewHolder { 
     // Using ButterKnife to create and hook Widget (remember the Image, too) 
     @BindView(R.id.rlLeftLayout) 
     RelativeLayout mRlLeftLayout; 
     @BindView(R.id.tvLeftTitle) 
     TextView mTvLeftTitle; 
     @BindView(R.id.tvLeftOverview) 
       TextView mTvLeftOverview; 
     @BindView(R.id.tvLeftCast) 
     TextView mTvLeftCast; 
     @BindView(R.id.imgLeftPoster) 
     ImageView mImgLeftPoster; 

     @BindView(R.id.rlRightLayout) 
     RelativeLayout mRlRightLayout; 
     @BindView(R.id.tvRightTitle) 
     TextView mTvRightTitle; 
     @BindView(R.id.tvRightOverview) 
     TextView mTvRightOverview; 
     @BindView(R.id.tvRightCast) 
     TextView mTvRightCast; 
     @BindView(R.id.imgRightPoster) 
     ImageView mImgRightPoster; 


     ViewHolder(View view) { 
      ButterKnife.bind(this, view); 
     } 
    } 
} 

这是我的活动:

public class MainActivity extends AppCompatActivity { 
    private static final String TAG = MainActivity.class.getSimpleName(); 
    MovieAdapter mAdapter; 
    List<Movie> mMovies = new ArrayList<Movie>(); 

    private NowPlaying mNowPlaying; 

    @BindView(android.R.id.list) 
    ListView mListView; 
    @BindView(android.R.id.empty) 
    TextView mEmptyView; 
    private MovieApi mMovieApi; 

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

//  final MovieAdapter adapter = new MovieAdapter(this, mMovies); 
// 
     mMovieApi = RetrofitUtils.get(getString(R.string.api_key)).create(MovieApi.class); 
     mMovieApi.getNowPlaying().enqueue(new Callback<NowPlaying>() { 

      @Override 
      public void onResponse(Call<NowPlaying> call, Response<NowPlaying> response) { 

       Log.d("Response", String.valueOf(response.isSuccessful())); 
       mMovies = response.body().getMovies(); 
       mAdapter = new MovieAdapter(this, mMovies); 
       mListView.setAdapter(mAdapter); 
       mListView.setEmptyView(mEmptyView); 



      } 

      @Override 
      public void onFailure(Call<NowPlaying> call, Throwable t) { 
       Log.e("Error", t.getMessage()); 
       Toast.makeText(MainActivity.this, "OK", Toast.LENGTH_SHORT).show(); 



      } 
     }); 



    } 
} 

我的堆栈跟踪:

10-15 23:04:19.480 12537-12537/com.example.rubit1359.bigcornbox E/AndroidRuntime: FATAL EXCEPTION: main 
                        Process: com.example.rubit1359.bigcornbox, PID: 12363 
                        java.lang.NullPointerException: Attempt to invoke virtual method 'void android.widget.ListView.setAdapter(android.widget.ListAdapter)' on a null object reference 
                         at com.example.rubit1359.bigcornbox.ui.MainActivity$1.onResponse(MainActivity.java:57) 
                         at retrofit2.ExecutorCallAdapterFactory$ExecutorCallbackCall$1$1.run(ExecutorCallAdapterFactory.java:68) 
                         at android.os.Handler.handleCallback(Handler.java:815) 
                         at android.os.Handler.dispatchMessage(Handler.java:104) 
                         at android.os.Looper.loop(Looper.java:194) 
                         at android.app.ActivityThread.main(ActivityThread.java:5637) 
                         at java.lang.reflect.Method.invoke(Native Method) 
                         at java.lang.reflect.Method.invoke(Method.java:372) 
                         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:960) 
                         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

我已经调试的应用,确保了mMovies ListView的填充。但是我无法设置适配器。任何人都可以帮助我发现错误。 谢谢。

更新XML

XML活动

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 
    xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:id="@+id/activity_main" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="@color/darkness" 
    tools:context="com.example.rubit1359.bigcornbox.ui.MainActivity"> 

    <ListView 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:layout_alignParentTop="true" 
     android:id="@+id/ListView" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentLeft="true"/> 

    <TextView 
     android:text="There is no data to display" 
     android:textStyle="bold" 
     android:textSize="20sp" 
     android:layout_centerHorizontal="true" 
     android:layout_centerVertical="true" 
     android:textColor="@color/colorWhite" 
     android:layout_width="wrap_content" 
     android:layout_height="wrap_content" 
     android:id="@+id/EmptyView" 
     /> 

</RelativeLayout> 

适配器XML:

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout 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:background="@color/darkness"> 


    <RelativeLayout 
     android:id="@+id/rlLeftLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentLeft="true" 
     android:layout_alignParentStart="true" 
     android:layout_alignParentTop="true" 
     android:background="@color/skypeGray"> 


     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@+id/imgLeftScoreBackground" 
      android:layout_alignTop="@+id/imgLeftPoster" 
      android:layout_toEndOf="@+id/imgLeftScoreBackground" 
      android:layout_toRightOf="@+id/imgLeftScoreBackground" 
      android:gravity="center_vertical" 
      android:orientation="vertical" 
      android:padding="16dp"> 

      <TextView 
       android:id="@+id/tvLeftTitle" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:lineSpacingExtra="5dp" 
       android:text="Captain America: Civil War" 
       android:textAlignment="viewEnd" 
       android:textColor="@color/redmilk" 
       android:textSize="15sp" 
       android:textStyle="bold"/> 

      <TextView 
       android:id="@+id/tvLeftOverview" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="15dp" 
       android:ellipsize="end" 
       android:lineSpacingExtra="5dp" 
       android:maxLines="5" 
       android:text="Following the events of Age of Ultron, the collective goverments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side..." 
       android:textAlignment="viewEnd" 
       android:textColor="@color/colorWhite" 
       android:textSize="12sp"/> 

      <TextView 
       android:id="@+id/tvLeftCast" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="20dp" 
       android:text="Chris Evans, Robert Downey Jr." 
       android:textAlignment="viewEnd" 
       android:textColor="@color/colorWhite" 
       android:textSize="12sp" 
       android:textStyle="bold|italic"/> 
     </LinearLayout> 

     <ImageView 
      android:id="@+id/imgLeftPoster" 
      android:layout_width="120dp" 
      android:layout_height="180dp" 
      android:layout_alignParentLeft="true" 
      android:layout_alignParentStart="true" 
      android:layout_alignParentTop="true" 
      app:srcCompat="@drawable/poster"/> 

     <ImageView 
      android:id="@+id/imgLeftScoreBackground" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_below="@+id/imgLeftPoster" 
      android:layout_marginTop="3dp" 
      app:srcCompat="@drawable/background"/> 

    </RelativeLayout> 

    <RelativeLayout 
     android:id="@+id/rlRightLayout" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:layout_alignParentEnd="true" 
     android:layout_alignParentRight="true" 
     android:layout_alignParentTop="true" 
     android:background="@color/skypeGray"> 

     <ImageView 
      android:id="@+id/imgRightPoster" 
      android:layout_width="120dp" 
      android:layout_height="180dp" 
      android:layout_alignParentEnd="true" 
      android:layout_alignParentRight="true" 
      android:layout_alignParentTop="true" 
      app:srcCompat="@drawable/poster"/> 

     <ImageView 
      android:id="@+id/imgRightScoreBackground" 
      android:layout_width="wrap_content" 
      android:layout_height="wrap_content" 
      android:layout_alignParentEnd="true" 
      android:layout_alignParentRight="true" 
      android:layout_below="@+id/imgRightPoster" 
      android:layout_marginTop="3dp" 
      app:srcCompat="@drawable/background_right"/> 


     <LinearLayout 
      android:layout_width="match_parent" 
      android:layout_height="wrap_content" 
      android:layout_alignBottom="@+id/imgRightScoreBackground" 
      android:layout_alignTop="@+id/imgRightPoster" 
      android:layout_toLeftOf="@+id/imgRightScoreBackground" 
      android:layout_toStartOf="@+id/imgRightScoreBackground" 
      android:gravity="center_vertical" 
      android:orientation="vertical" 
      android:padding="16dp"> 

      <TextView 
       android:id="@+id/tvRightTitle" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:lineSpacingExtra="5dp" 
       android:text="Captain America: Civil War" 
       android:textAlignment="viewStart" 
       android:textColor="@color/redmilk" 
       android:textSize="15sp" 
       android:textStyle="bold"/> 

      <TextView 
       android:id="@+id/tvRightOverview" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="15dp" 
       android:ellipsize="end" 
       android:lineSpacingExtra="5dp" 
       android:maxLines="5" 
       android:text="Following the events of Age of Ultron, the collective goverments of the world pass an act designed to regulate all superhuman activity. This polarizes opinion amongst the Avengers, causing two factions to side..." 
       android:textAlignment="viewStart" 
       android:textColor="@color/colorWhite" 
       android:textSize="12sp"/> 

      <TextView 
       android:id="@+id/tvRightCast" 
       android:layout_width="match_parent" 
       android:layout_height="wrap_content" 
       android:layout_marginTop="20dp" 
       android:text="Chris Evans, Robert Downey Jr." 
       android:textAlignment="viewStart" 
       android:textColor="@color/colorWhite" 
       android:textSize="12sp" 
       android:textStyle="bold|italic"/> 
     </LinearLayout> 


    </RelativeLayout> 
</RelativeLayout> 
+0

你mListView为空 –

+0

是的,我知道,但我不知道为什么它是空的 –

+0

你有没有id li st在activity_main? –

回答

0

您正在使用ListView控件的ID是inbuild android.R.id.list这就需要你与ListActivity拓展业务。

因此,请用ListActivity扩展您的活动。这样

public class MainActivity extends ListActivity 

,或者,如果您使用的使用习惯的ListView与您的ID,然后用同样的活动,只是给你在你的XML文件中定义正确的ID并对其进行初始化。

像这样的事情

ListView list = (ListView) view.findViewById(R.id.yourlistviewid); 
+0

在这里我尝试使用正常Activity内的ListView保持ActionBar。所以我将ListView绑定到Activity。所以我无法扩展ListActivity。 –

+0

然后不要使用'android.R.id.list'。使用你自己的ID的列表视图,并在使用它之前进行初始化。因为这个,它是空的。 –

+0

我只是尝试使用@ + id,但问题仍然存在。 –

1

你得到一个错误ID: 更改这些行:

@BindView(android.R.id.list) 
ListView mListView; 

到:

@BindView(R.id.ListView) 
ListView mListView; 
+0

当前的xml文件是我已经将android.id更改为R.id.ListView。我也改变了活动中的BindView。所以这不是问题 –

+0

您是否发布整个堆栈跟踪? –

相关问题