当我点击recycleview的元素时,应用程序会继续崩溃

时间:2017-01-09 08:54:25

标签: java android android-recyclerview picasso

当我单击循环视图的每个项目时,为什么此应用程序无法正常工作项目位置的Toast会出现,但是当我单击每个项目(cardview)以打开新的活动应用程序崩溃时。我不知道出了什么问题。

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

            }
        } }

1 个答案:

答案 0 :(得分:0)

您无需在detail.java活动中使用OnCardClicked。使用serializable从一个活动发送数据。使用OnCardClicked.onBindViewHolder将数据从一个活动发送到另一个活动。

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

            }

        }
    }