java - 当我切换到另一个包含回收器 View 的 Activity 时,应用程序崩溃

标签 java android android-studio android-recyclerview

当从主要 Activity 点击 ImageView 切换到第二个 Activity 时 崩溃。我可以切换到第二个 Activity ,直到我实现回收 View 。 我猜布局管理器存在某种问题。

activity_second.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="vertical">

<android.support.v7.widget.RecyclerView

    android:id="@+id/recyclerView"

    android:layout_width="match_parent"

    android:layout_height="match_parent" />

HomeItemAdapter.java

public class HomeItemAdapter extends RecyclerView.Adapter<HomeItemAdapter.ViewHolder> {
private static final String TAG = "NTR-HomeItemAdapter";

//    private String[] mDataSet;
public ArrayList<HashMap<String, String>> mDataSource;
private Context mContext;

public HomeItemAdapter(Context context, ArrayList<HashMap<String, String>> mDataSource) {
    this.mDataSource = mDataSource;
    this.mContext = context;
}

@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.row_home_item, viewGroup, false);

    return new ViewHolder(v);
}

@Override
public void onBindViewHolder(final ViewHolder viewHolder, int position) {
    Target target;
    Log.d(TAG, "Element " + position + " set.");

    viewHolder.getName().setText(mDataSource.get(position).get("name"));
    viewHolder.getCity().setText(mDataSource.get(position).get("city"));

    //Get Marquee
    viewHolder.getName().setSingleLine();
    viewHolder.getName().setEllipsize(TextUtils.TruncateAt.MARQUEE);
    viewHolder.getName().setHorizontallyScrolling(true);
    viewHolder.getName().setFocusableInTouchMode(true);
    viewHolder.getName().setSelected(true);
    viewHolder.getName().setMarqueeRepeatLimit(-1);

    viewHolder.getCity().setSingleLine();
    viewHolder.getCity().setEllipsize(TextUtils.TruncateAt.MARQUEE);
    viewHolder.getCity().setHorizontallyScrolling(true);
    viewHolder.getCity().setFocusableInTouchMode(true);
    viewHolder.getCity().setSelected(true);
    viewHolder.getCity().setMarqueeRepeatLimit(-1);

    // Get Dynamic Color
    target = new com.squareup.picasso.Target() {
        @Override
        public void onBitmapLoaded(final Bitmap bitmap, Picasso.LoadedFrom from) {
            Palette.generateAsync(bitmap, new Palette.PaletteAsyncListener() {
                public void onGenerated(Palette palette) {
                    if (palette !=null) {
                        viewHolder.getImageCover().setImageBitmap(bitmap);
                        Palette.Swatch vibrant = palette.getVibrantSwatch();
                        if(vibrant!=null) {
                            viewHolder.getCardItemHome().setBackgroundColor(vibrant.getRgb());
                            viewHolder.getName().setTextColor(vibrant.getTitleTextColor());
                            viewHolder.getCity().setTextColor(vibrant.getTitleTextColor());
                        }
                    }
                }
            });
        }

        @Override
        public void onBitmapFailed(Drawable errorDrawable) {
            viewHolder.getImageCover().setImageResource(R.drawable.cover);
        }

        @Override
        public void onPrepareLoad(Drawable placeHolderDrawable) {

        }
    };
    Log.d(TAG,mDataSource.get(position).get("image_url"));

    Picasso.with(mContext)
            .load(mDataSource.get(position).get("image_url"))
            .into(target);

}

@Override
public int getItemCount() {
    return mDataSource.size();
}

public static class ViewHolder extends RecyclerView.ViewHolder {
    private final CardView cardItemHome;
    private final ImageView imgCover;
    private final TextView txtName;
    private final TextView txtCity;

    public ViewHolder(View v) {
        super(v);
        // Define click listener for the ViewHolder's View.
        v.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Log.d(TAG, "Element " + getPosition() + " clicked.");
            }
        });
        cardItemHome = (CardView) v.findViewById(R.id.card_item_home);
        txtName = (TextView) v.findViewById(R.id.txt_name);
        txtCity = (TextView) v.findViewById(R.id.txt_city);
        imgCover = (ImageView) v.findViewById(R.id.img_cover);

    }

    public CardView getCardItemHome() {
        return cardItemHome;
    }

    public TextView getName() {
        return txtName;
    }

    public TextView getCity() {
        return txtCity;
    }

    public ImageView getImageCover() {
        return imgCover;
    }

  }

}

第二个 Activity .java

public class SecondActivity extends ActionBarActivity {

public ArrayList<HashMap<String, String>> mDataSource;

protected RecyclerView mRecyclerView;
protected RecyclerView.LayoutManager mLayoutManager;
protected HomeItemAdapter mAdapter;

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

    //Initialize Data Source
    initDataset();

    // BEGIN_INCLUDE(initializeRecyclerView)
    mRecyclerView = (RecyclerView) findViewById(R.id.recyclerView);

    //The LayoutManager defines how elements are laid out.
    mLayoutManager = new GridLayoutManager(this, 3);
    mRecyclerView.setLayoutManager(mLayoutManager);

    mAdapter = new HomeItemAdapter(this, mDataSource);
    // Set CustomAdapter as the adapter for RecyclerView.
    mRecyclerView.setAdapter(mAdapter);
    // END_INCLUDE(initializeRecyclerView)
}


private void initDataset() {
    mDataSource = new ArrayList();
    HashMap<String, String> h1 = new HashMap();
    h1.put("name", "FIFTH HARMONY");
    h1.put("city", "Reflection");
    h1.put("image_url","http://www.azlyrics.com/hot/fifthharmony_B00MS4BUUU.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "PAPA ROACH");
    h1.put("city", "F.E.A.R.");
    h1.put("image_url","http://www.azlyrics.com/hot/919y0earTjL.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "Ellie Goulding");
    h1.put("city", "ドラえもん");
    h1.put("image_url","http://cdn1.umg3.net/12/files/2013/07/EG_HD_stan.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "SAYWECANFLY");
    h1.put("city", "Between The Roses");
    h1.put("image_url","http://www.azlyrics.com/hot/61-TWobzipL.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "NE-YO");
    h1.put("city", "Non-Fiction");
    h1.put("image_url","http://www.azlyrics.com/hot/81kBXMLAHkL.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "Frozen");
    h1.put("city", "Frozen Heart Lyrics");
    h1.put("image_url","http://www.stlyrics.com/images/ama/frozen_6430.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "2NE1");
    h1.put("city", "K-Pop Superstar");
    h1.put("image_url","http://www.billboard.com/files/styles/promo_310/public/media/cl_2ne1_instagram_kpop2014_650-430a.png");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "PAPA ROACH");
    h1.put("city", "F.E.A.R.");
    h1.put("image_url","http://www.azlyrics.com/hot/919y0earTjL.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "SAYWECANFLY");
    h1.put("city", "Between The Roses");
    h1.put("image_url","http://www.azlyrics.com/hot/61-TWobzipL.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "NE-YO");
    h1.put("city", "Non-Fiction");
    h1.put("image_url","http://www.azlyrics.com/hot/81kBXMLAHkL.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "Frozen");
    h1.put("city", "Frozen Heart Lyrics");
    h1.put("image_url","http://www.stlyrics.com/images/ama/frozen_6430.jpg");
    mDataSource.add(h1);

    h1 = new HashMap();
    h1.put("name", "2NE1");
    h1.put("city", "K-Pop Superstar");
    h1.put("image_url","http://www.billboard.com/files/styles/promo_310/public/media/cl_2ne1_instagram_kpop2014_650-430a.png");
    mDataSource.add(h1);
  }

}

日志

Process: com.example.sensei.mist, PID: 2193
                                                                   java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.sensei.mist/com.example.sensei.mist.SecondActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2325)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387)
                                                                       at android.app.ActivityThread.access$800(ActivityThread.java:151)
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303)
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102)
                                                                       at android.os.Looper.loop(Looper.java:135)
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5254)
                                                                       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:903)
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698)
                                                                    Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'void android.support.v7.widget.RecyclerView.setLayoutManager(android.support.v7.widget.RecyclerView$LayoutManager)' on a null object reference
                                                                       at com.example.sensei.mist.SecondActivity.onCreate(SecondActivity.java:33)
                                                                       at android.app.Activity.performCreate(Activity.java:5990)
                                                                       at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1106)
                                                                       at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2278)
                                                                       at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2387) 
                                                                       at android.app.ActivityThread.access$800(ActivityThread.java:151) 
                                                                       at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1303) 
                                                                       at android.os.Handler.dispatchMessage(Handler.java:102) 
                                                                       at android.os.Looper.loop(Looper.java:135) 
                                                                       at android.app.ActivityThread.main(ActivityThread.java:5254) 
                                                                       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:903) 
                                                                       at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:698) 

最佳答案

在SecondActivity中,改变

setContentView(R.layout.activity_main);

setContentView(R.layout.activity_second);

关于java - 当我切换到另一个包含回收器 View 的 Activity 时,应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38555133/

相关文章:

android - 有没有更快的方法从网上下载一个页面到一个字符串?

android - 如何使用 Jsoup 从 Google 获取#resultStats

java - 当我通过命令提示符运行我的 java 文件时出现错误

java - junit 上的 org/hamcrest/Matchers 上出现 NoClassDefFoundError

java - 如何使用 Selenium 选择文本框中提供的选项

android - Android:在从Android Studio访问之前,gradle无法正常工作

java - 创建apk时报错: this class should provide a default constructor,

java - spring mvc注解验证

android - Android Kotlin相机 Intent 崩溃

android - 如何使用 Amazon Web Services 获取上传成功状态?