当我点击 recycleview 的元素时,应用程序一直崩溃

App keeps on crashing when I click in element of recycleview

为什么当我点击回收视图的每个项目时这个应用程序无法正常工作项目位置的吐司出现但是当我点击每个项目(cardview)打开一个新的activity应用程序崩溃。我不知道出了什么问题。

GalleryFragment.java

    package com.example.kiran.cr7;

    import android.content.Context; 
    import android.content.Intent;
    import android.os.Bundle; 
    import android.support.v4.app.Fragment; 
    import android.support.v7.widget.CardView; 
    import android.support.v7.widget.GridLayoutManager;
    import android.support.v7.widget.LinearLayoutManager; 
    import android.support.v7.widget.RecyclerView; 
    import android.util.Log; 
    import android.view.LayoutInflater; 
    import android.view.View;
    import android.view.ViewGroup; 
    import android.widget.AdapterView;
    import android.widget.GridView; 
    import android.widget.Toast;

    import java.util.ArrayList;


    /**  * A simple {@link Fragment} subclass.  */ public class GalleryFragment extends Fragment implements Adapter.OnCardClickListner {


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


        private RecyclerView mrecycleview;
        private CardView mcardview;
        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            // Inflate the layout for this fragment
            View view = inflater.inflate(R.layout.fragment_gallery, container, false);
            mrecycleview = (RecyclerView)view.findViewById(R.id.recycle_view);
            mcardview = (CardView)view.findViewById(R.id.card_view);

            //improve performance
            mrecycleview.setHasFixedSize(true);

            LinearLayoutManager manager = new LinearLayoutManager(view.getContext());
            mrecycleview.setLayoutManager(manager);

            ArrayList<Item> itemlist = dummies();

            //set adapter //        Adapter adapter = new Adapter(view.getContext(),itemlist); //        mrecycleview.setAdapter(adapter); //        adapter.setOnCardClickListner(this);

            Adapter adapter = new Adapter(view.getContext(),itemlist);
            mrecycleview.setAdapter(adapter);
            adapter.setOnCardClickListner(this);

            return view;
        }
        private ArrayList<Item> dummies() {
            ArrayList<Item> list = new ArrayList<>();
            for (int i = 0; i < 6; i++) {
                if (i == 0) {
                    Item item = new Item();
                    item.id = i;
                    item.text = "RonaldoPhoto" + (i);
                    item.img = "http://wallpapercave.com/wp/sIggTrG.jpg";
                    list.add(item);
                } else if (i  == 1) {
                    Item item = new Item();
                    item.id = i;
                    item.text = "RonaldoPhoto" + (i);
                    item.img = "http://i2.wp.com/www.footballwood.com/wp-content/uploads/2015/01/Ronaldo-Best-Wallpapers.jpg";
                    list.add(item);
                } else if (i  == 2) {
                    Item item = new Item();
                    item.id = i;
                    item.text = "RonaldoPhoto" + (i);
                    item.img = "http://www.magazinefuse.com/wp-content/uploads/2015/09/7-i476725-1024x640.jpg";
                    list.add(item);
                } else if (i  == 3) {
                    Item item = new Item();
                    item.id = i;
                    item.text = "RonaldoPhoto" + (i);
                    item.img = "https://i.ytimg.com/vi/SwHv6xGGBBQ/maxresdefault.jpg";
                    list.add(item);
                }else if (i  == 4) {
                    Item item = new Item();
                    item.id = i;
                    item.text = "RonaldoPhoto" + (i);
                    item.img = "https://i.ytimg.com/vi/WrCfkR4Qcns/maxresdefault.jpg";
                    list.add(item);
                }

                else if (i  == 5) {
                    Item item = new Item();
                    item.id = i;
                    item.text = "RonaldoPhoto" + (i);
                    item.img = "http://images.latinpost.com/data/images/full/101477/cristiano-ronaldo-real-madrid.jpg";
                    list.add(item);
                }
            }
            return list;
        }

        @Override
        public void OnCardClicked(View view, int position) {
            Log.d("OnClick", "Card Position" + position);
            Toast.makeText(getContext(),"click"+position,Toast.LENGTH_SHORT).show();
            Intent in= new Intent(view.getContext(),Detail.class);
            in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
            startActivity(in);

        } }

Adapter.java

    package com.example.kiran.cr7;
    import android.app.Activity;
    import android.content.Context;
    import android.content.Intent;
    import android.support.v4.app.Fragment;
    import android.support.v4.app.FragmentManager;
    import android.support.v7.widget.CardView;
    import android.support.v7.widget.RecyclerView;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ImageView;
    import android.widget.TextView;
    import android.widget.Toast;

    import com.squareup.picasso.Picasso;

    import java.util.ArrayList;


    public class Adapter extends RecyclerView.Adapter<Adapter.ViewHolder>{

        private RecyclerView mRecyclerView;
        private Context context;
        private ArrayList<Item> itemlist;

        OnCardClickListner onCardClickListner;


        public Adapter(Context context, ArrayList<Item> itemlist){
            this.context = context;
            this.itemlist = itemlist;
        }

        @Override
        public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            LayoutInflater inflater = LayoutInflater.from(parent.getContext());
            View view = inflater.from(parent.getContext()).inflate(R.layout.cardview,parent,false);


            mRecyclerView = (RecyclerView) view.findViewById(R.id.recycle_view);
            ViewHolder viewholder = new ViewHolder(view);
            return viewholder;

        }

        //bind views with data
        @Override
        public void onBindViewHolder(ViewHolder holder, final int position) {
            final Item item = itemlist.get(position);

            //get element form your dataset at this position
            //replace the contents of the view with that element
            Picasso.with(context)
                    .load(item.img)
                    .placeholder(R.drawable.fern)
                    .error(android.R.drawable.stat_notify_error)
                    .into(holder.cardimage);
            holder.cardtext.setText(item.text);

            holder.card_view.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View v) {
                    onCardClickListner.OnCardClicked(v,position);
                    Intent in = new Intent(v.getContext(), Detail.class);
                    in.putExtra("item",item);
                    in.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                    //context.startActivity(in);
                }
            });     
        }

        @Override
        public int getItemCount() {
            if(itemlist != null){
                return itemlist.size();
            }
            return 0;
        }

        //provide the reference to the views for each data item
        //ViewHolder class
        //since it is static it uses only single memory so protect memory leak  : a design pattern for android
        public static class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

            public CardView card_view;
            public TextView cardtext;
            public ImageView cardimage;

            //connects which view belongs to which layout
            public ViewHolder(View itemView) {
                super(itemView);
                card_view = (CardView)itemView.findViewById(R.id.card_view);
                cardtext = (TextView)itemView.findViewById(R.id.cardtext);
                cardimage = (ImageView)itemView.findViewById(R.id.cardimage);
            }

            @Override
            public void onClick(View view) {

            }
        }
        public interface OnCardClickListner {
            void OnCardClicked(View view, int position);
        }

        public void setOnCardClickListner(OnCardClickListner onCardClickListner) {
            this.onCardClickListner = onCardClickListner;
        }
    }

详情

        package com.example.kiran.cr7;

    import android.app.DownloadManager; import android.content.Context; import android.net.ConnectivityManager; import android.net.NetworkInfo; import android.net.Uri; import android.os.Bundle; import android.support.v7.app.AppCompatActivity; import android.util.Log; import android.view.View; import android.widget.ImageView; import android.widget.Toast;

    import com.squareup.picasso.Picasso;

    import java.util.ArrayList;

    public class Detail extends AppCompatActivity implements      Adapter.OnCardClickListner {

        private ImageView detailimage;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.activity_detail);

            detailimage = (ImageView)findViewById(R.id.detailimage);



        }

        @Override
        public void OnCardClicked(View view, int position) {
            Log.d("OnClick", "Card Position" + position);
            if(getIntent().getSerializableExtra("item") != null){
                Item i = (Item)getIntent().getSerializableExtra("item");
                Picasso.with(this)
                        .load(i.img)
                        .placeholder(R.drawable.fern)
                        .error(android.R.drawable.stat_notify_error)
                        .into(detailimage);

            }
        } }

您不需要在 detail.java activity 中使用 OnCardClicked。使用 serializable 从一个 activity 从另一个发送数据。使用 OnCardClicked.onBindViewHolder 将数据从一个 activity 发送到另一个。

 package com.example.kiran.cr7;

    import android.app.DownloadManager;
    import android.content.Context;
    import android.net.ConnectivityManager;
    import android.net.NetworkInfo;
    import android.net.Uri;
    import android.os.Bundle;
    import android.app.Activity;
    import android.view.View;
    import android.view.animation.Animation;
    import android.view.animation.AnimationUtils;
    import android.widget.Button;
    import android.widget.ImageView;
    import android.widget.Toast;

    import com.squareup.picasso.Picasso;

    public class Test extends Activity {
        private ImageView detailimage;
        private Button download;
        DownloadManager downloadManager;

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

            download = (Button) findViewById(R.id.Download);
            detailimage = (ImageView) findViewById(R.id.detailimage);
            final Animation animAlpha = AnimationUtils.loadAnimation(this,R.anim.anim_alpha);

            if (getIntent().getSerializableExtra("item") != null) {
                 final Item i = (Item) getIntent().getSerializableExtra("item");
                Picasso.with(this)
                        .load(i.img)
                        .resize(500,600)
                        .placeholder(R.drawable.fern)
                        .error(android.R.drawable.stat_notify_error)
                        .into(detailimage);

                ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
                NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();
                if (networkInfo != null && networkInfo.isConnected()) {
                    //Toast.makeText(Test.this, "Network Connection available", Toast.LENGTH_LONG).show();
                } else {
                    Toast.makeText(Test.this, "No Network Connection", Toast.LENGTH_LONG).show();
                }

                download.setOnClickListener(new View.OnClickListener() {
                    @Override
                    public void onClick(View view) {
                        view.startAnimation(animAlpha);
                        downloadManager =(DownloadManager) getSystemService(Context.DOWNLOAD_SERVICE);
                        Uri uri = Uri.parse(i.img);
                        DownloadManager.Request request = new DownloadManager.Request(uri);
                        request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
                        Long reference = downloadManager.enqueue(request);
                    }
                });

            }

        }
    }