0

So I have two Adapter class for RecyclerView. I want the ImageView inside one Adapter class to display the other Adapter class

I already tried to use intent on MainActivity

// listener for image
        cardViewHolder.photo.setOnClickListener(new CustomOnItemClick(
                i, new CustomOnItemClick.OnItemClickCallback() {
            @Override
            public void onItemClicked(View view, int position) {
            Intent detail = new Intent(context,DetailAdapter.class);
                context.startActivity(detail);
            }
        }
        ));

here is the link for what the application supposed to be https://ibb.co/gmnnghw https://giphy.com/gifs/Y3NK0lHfAcN1dGbCZX

CardViewDeviceAdapter

package com.example.myapplication;

import android.content.Context;
import android.content.Intent;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;

import java.util.ArrayList;

public class CardViewDeviceAdapter extends RecyclerView.Adapter<CardViewDeviceAdapter.CardViewHolder> {

    private Context context;
    private ArrayList<Device> deviceArrayList;
    private ArrayList<Device> getDeviceArrayList() {
        return deviceArrayList;
    }



    public void setDeviceArrayList(ArrayList<Device> deviceArrayList) {
        this.deviceArrayList = deviceArrayList;
    }

    public CardViewDeviceAdapter(Context context) {
        this.context = context;
    }

    @Override
    public CardViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_device, viewGroup, false);
        return new CardViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull CardViewHolder cardViewHolder, int i) {
        Device d = getDeviceArrayList().get(i);

        Glide.with(context)
                .load(d.getPhoto())
                .apply(new RequestOptions().override(350, 550))
                .into(cardViewHolder.photo);

        cardViewHolder.title.setText(d.getTitle());
        cardViewHolder.detail.setText(d.getDetail());


        // listener untuk button favorite
        cardViewHolder.favorite.setOnClickListener(new CustomOnItemClick(
                i, new CustomOnItemClick.OnItemClickCallback() {
            @Override
            public void onItemClicked(View view, int position) {
                Toast.makeText(context, "Favorite device"+getDeviceArrayList()
                .get(position)
                .getTitle()
                , Toast.LENGTH_SHORT).show();
            }
        }
        ));

        // listener untuk button share
        cardViewHolder.share.setOnClickListener(new CustomOnItemClick(
                i, new CustomOnItemClick.OnItemClickCallback() {
            @Override
            public void onItemClicked(View view, int position) {
                Toast.makeText(context, "Share device"+getDeviceArrayList()
                                .get(position)
                                .getTitle()
                        , Toast.LENGTH_SHORT).show();
            }
        }
        ));

        // listener untuk image
        cardViewHolder.photo.setOnClickListener(new CustomOnItemClick(
                i, new CustomOnItemClick.OnItemClickCallback() {
            @Override
            public void onItemClicked(View view, int position) {
                Intent detail = new Intent(context, DetailAdapter.class);
                context.startActivity(detail);
            }
        }
        ));
    }

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

    public class CardViewHolder extends RecyclerView.ViewHolder {
        ImageView photo;
        TextView title, detail;
        Button favorite, share;
        public CardViewHolder(View itemView) {
            super(itemView);
            photo = itemView.findViewById(R.id.pc_photo);
            title = itemView.findViewById(R.id.pc_name);
            detail = itemView.findViewById(R.id.pc_details);
            favorite = itemView.findViewById(R.id.pc_favourite);
            share = itemView.findViewById(R.id.pc_share);
        }
    }
}

DetailAdapter

package com.example.myapplication;

import android.content.Context;
import android.support.annotation.NonNull;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

import com.bumptech.glide.Glide;
import com.bumptech.glide.request.RequestOptions;

import java.util.ArrayList;

public class DetailAdapter extends RecyclerView.Adapter<DetailAdapter.DetailHolder> {

    private Context context;
    private ArrayList<Device> deviceArrayList;
    private ArrayList<Device> getDeviceArrayList() {
        return deviceArrayList;
    }


    @NonNull
    @Override
    public DetailAdapter.DetailHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {
        View view = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.detail_adapter, viewGroup, false);
        return new DetailAdapter.DetailHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull DetailAdapter.DetailHolder detailHolder, int i) {
        Device d = getDeviceArrayList().get(i);

        Glide.with(context)
                .load(d.getPhoto())
                .apply(new RequestOptions().override(350, 550))
                .into(detailHolder.photo);

        detailHolder.title.setText(d.getTitle());
        detailHolder.detail.setText(d.getDetail());
        detailHolder.summary.setText(d.getSummary());
        detailHolder.origin.setText(d.getOrigin());
        detailHolder.market_value.setText(d.getMarket_value());
        detailHolder.consumer.setText(d.getConsumer());
    }

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


    public class DetailHolder extends RecyclerView.ViewHolder {
        ImageView photo;
        TextView title, detail, summary, origin, market_value, consumer;
        public DetailHolder(View view) {
            super(view);
            photo = view.findViewById(R.id.photo_detail);
            title = view.findViewById(R.id.title_title);
            detail = view.findViewById(R.id.detail_title);
            summary = view.findViewById(R.id.detail_detail);
            origin = view.findViewById(R.id.origin_year);
            market_value = view.findViewById(R.id.market_value);
            consumer = view.findViewById(R.id.konsumer);
        }
    }
}

Right now it asks for explicit activity on AndroidManifest.xml , but I can't assign DetailAdapter to AndroidManifest.xml

Logcat

2019-05-29 17:38:59.097 8897-8897/com.example.myapplication E/AndroidRuntime: FATAL EXCEPTION: main
    Process: com.example.myapplication, PID: 8897
    android.content.ActivityNotFoundException: Unable to find explicit activity class {com.example.myapplication/com.example.myapplication.DetailAdapter}; have you declared this activity in your AndroidManifest.xml?
        at android.app.Instrumentation.checkStartActivityResult(Instrumentation.java:2012)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1675)
        at android.app.Activity.startActivityForResult(Activity.java:4586)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:767)
        at android.app.Activity.startActivityForResult(Activity.java:4544)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:754)
        at android.app.Activity.startActivity(Activity.java:4905)
        at android.app.Activity.startActivity(Activity.java:4873)
        at com.example.myapplication.CardViewDeviceAdapter$3.onItemClicked(CardViewDeviceAdapter.java:89)
        at com.example.myapplication.CustomOnItemClick.onClick(CustomOnItemClick.java:16)
        at android.view.View.performClick(View.java:6608)
        at android.view.View.performClickInternal(View.java:6585)
        at android.view.View.access$3100(View.java:782)
        at android.view.View$PerformClick.run(View.java:25945)
        at android.os.Handler.handleCallback(Handler.java:874)
        at android.os.Handler.dispatchMessage(Handler.java:100)
        at android.os.Looper.loop(Looper.java:198)
        at android.app.ActivityThread.main(ActivityThread.java:6729)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:858)

App crashses when tapping on Image

RKRK
  • 1,354
  • 5
  • 14
  • 17
usrnamefix
  • 77
  • 6

1 Answers1

1

You've got all the concept of RecyclerView wrong. Check out how to use RecyclerView from Simple RecyclerView Example.

What you're trying to do is launch RecyclerView like an Activity. Your RecyclerView is not an activity, it is a view. In the gif you've attached to shown what you want to accomplish, it's a completely different thing. After clicking the item in RecyclerView, a new activity is launched with SharedElement transition. Your DetailAdapter should be AppCompatActivity.

To correct your error, make your DetailAdapter extend AppCompatActivity, after doing that, while launching the DetailAdapter with Intent, pass the data like title, detail through Intent.

Vedprakash Wagh
  • 2,552
  • 2
  • 5
  • 23