简体   繁体   中英

App keeps on crashing when I click in element of recycleview

Why is this app is not working properly when I click on the each item of the recycle view Toast of the position of the item appears but when I click each item(cardview) to open a new activity app crash. I don't know what is wrong.

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;
        }
    }

Detail

        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);

            }
        } }

You don't need to use OnCardClicked in detail.java activity. Use serializable to send data from one activity from another. Use OnCardClicked.onBindViewHolder to send data from one activity to another.

 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);
                    }
                });

            }

        }
    }

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM