1

I am learning Android Development. Struggling with this issue since 24 hours, need help.

On my each recycle view item I've two views ePaper & Website. I want to attach different on click listeners on the entire item, ePaper view and website view

enter image description here

In the above image, I need to put 3 click listeners 1. Click on red block 1 - do X (Intent to another activity) 2. Click on red block 2 - do Y (Intent to another activity) 3. Click on green block, entire item view - do Z (Dialog)

Tried many solutions. But, when I click red block, the listener in green block also comes to action in addition to listener in red block.

In the MainActivity

recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getApplicationContext(),
            recyclerView, new ClickListener() {
        String userid = Utils.getUserId(getApplicationContext());
        @Override
        public void onClick(View view, final int position) {
            // Set listeners here for complete card view
            final NewsPapersDataModel currentPaper = newsPapersList.get(position);
            Log.d("TAG","Clicked 1");

                newsSelectionDialog(currentPaper.getEpaper(),currentPaper.getWebsite());
        }
        @Override
        public void onLongClick(View view, int position) {
            Toast.makeText(MainActivity.this, "Long press on position :" + position, Toast.LENGTH_LONG).show();
        }
    }));

In the NewsPaperAdapter

    public void onBindViewHolder(@NonNull final CustomViewHolder holder, int position) {
    //  Log.d("TAG","Holder is "+newsList);

    final NewsPapersDataModel currentItem = newsList.get(position);
    final String ePaperUrl = currentItem.getEpaper();
    final String webSiteUrl = currentItem.getWebsite();
    final String paperName = currentItem.getName();

    holder.paperNameView.setText(newsList.get(position).getName());

    if (TextUtils.isEmpty(currentItem.getEpaper())) {
        //  Log.d("TAGG","ePaper - "+currentItem.getEpaper()+" Website - "+currentItem.getWebsite());
        holder.ePaperView.setVisibility(View.GONE);

    } else if (TextUtils.isEmpty(currentItem.getWebsite())) {
        holder.websiteView.setVisibility(View.GONE);

    }

    holder.ePaperView.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View view) {

            saveLinksToDb(userid, "ePaper", ePaperUrl);
            Intent intent = new Intent(context, NewsAdvancedWebViewActivity.class);
            intent.putExtra("url", ePaperUrl);
            context.startActivity(intent);

        }
    });

    holder.websiteView.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

            saveLinksToDb(userid, "Website", webSiteUrl);
            Intent intent = new Intent(context, NewsAdvancedWebViewActivity.class);
            intent.putExtra("url", webSiteUrl);
            intent.putExtra("paperName",paperName);
            context.startActivity(intent);

        }
    });

}

Please help me.

Pradeep Behera
  • 475
  • 6
  • 15

3 Answers3

3

You need to create an interface in your adapter for click listeners and add onclick methods for every item you want.

Please look into the code below.

In your adapter, create interface

public interface OnClickListener {
    void onPaperViewClick(View view, int position);
    void onWebsiteViewClick(View view, int position);
}

And create method to set click listener from activity

public void setOnClickListener(OnClickListener listener) {
    this.onClickListener= listener;
}

And in your onBindViewHolder method,

holder.ePaperView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        onClickListener.onPaperViewClick(view, position);
});

holder.websiteView.setOnClickListener(new View.OnClickListener() {

    @Override
    public void onClick(View view) {

        onClickListener.onWebsiteViewClick(view, position);
});

and lastly, in your activity, set

recyclerViewAdapter.setOnClickListener(new NewsPaperAdapter.OnClickListener(){
    @override
    void onPaperViewClick(View view, int position){
         // code to handle paper click
    }

    @override
    void onPaperViewClick(View view, int position){
        // code to handle website click
    }
};
Massab
  • 1,030
  • 9
  • 22
0

try in your NewsPaperAdapter class onClickListner to parent layout of adapter like below

holder.parentLayout.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View view) {

         final NewsPapersDataModel currentPaper = newsPapersList.get(position);
            Log.d("TAG","Clicked 1");

                newsSelectionDialog(currentPaper.getEpaper(),currentPaper.getWebsite());
        }
    });

here parentLayout is your adapter item layout root view like Relative/Linear Layout

Omkar
  • 3,040
  • 1
  • 22
  • 42
0

Remove your TouchListener from MainActivity and add ClickListener/ LonCkickListener inside your adapter.

onBindViewHolder(){
    //rest of your code

    holder.itemView.setOnClickListener(new OnClickListener{
        @Override
        public void onClick(View view) {
           // Click implementation here
        }
        @Override
        public void onLongClick(View view) {
           // Long click implementation here
        }

    })
}

And inside your CustomViewHolder:

public class CustomViewHolder extends RecyclerView.ViewHolder{
    // Other fields

    View itemView;
    public CustomViewHolder(View view){
    // rest of initialization

    itemView = view;
    }
}

EDIT (OP wants to handle application logic inside Activity)

Create an interface class named RecyclerViewActionListener:

public interface RecyclerViewActionListener {
    void onViewClicked(int clickedViewId, int clickedItemPosition);
    void onViewLongClicked(int clickedViewId, int clickedItemPosition);
}

Then modify your RecyclerViewAdpater to have an additional field in constructor. We will pass listener from Activity to this adpater when we create Adapter:

public class RecyclerViewAdpater extends RecyclerView.Adapter<RecyclerViewAdpater.CustomViewHolder>{

    private RecyclerViewActionListener mListener;

    public RecyclerViewAdpater(ArrayList<Object> yourData,RecyclerViewActionListener mListener) {
        this.mListener = mListener;
    }

    @NonNull
    @Override
    public CustomViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item, parent, false );
        final CustomViewHolder holder = new CustomViewHolder(view);

        holder.webView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.onViewClicked(view.getId(), holder.getAdapterPosition());
            }
        });
        holder.paperView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.onViewClicked(view.getId(), holder.getAdapterPosition());
            }
        });
        holder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                mListener.onViewClicked(view.getId(), holder.getAdapterPosition());
            }
        });
        holder.itemView.setOnLongClickListener(new View.OnLongClickListener() {
            @Override
            public boolean onLongClick(View view) {
                mListener.onViewLongClicked(view.getId(), holder.getAdapterPosition());
                return false;
            }
        });
        return holder;
    }

    public class CustomViewHolder extends RecyclerView.ViewHolder{
        // Other fields

        View itemView;
        View webView;
        View paperView;
        public CustomViewHolder(View view){
            super(view);
            // rest of initialization

            itemView = view;
        }
    }
}

And then implement RecyclerViewActionListener in your Activity and override methods from RecyclerViewActionListener:

public class MainActivity extends AppCompatActivity implements RecyclerViewActionListener {


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

        // Skipped for the sake of brevity
        // Pass your listener to adapter here
        adapter = new RecyclerViewAdpater(yourData, this );
    }

    @Override
    public void onViewClicked(int clickedViewId, int clickedItemPosition) {
        switch (clickedItemPosition){
            case R.id.web_view:
                // Application logic when webview clicked
                break;
            case R.id.paper_view:
                // Application logic when paperview clicked
                break;
            case R.id.recyclerview_item:
                // Application logic when whole item clicked
                break;
        }
    }

    @Override
    public void onViewLongClicked(int clickedViewId, int clickedItemPosition) {
        switch (clickedViewId){
            case R.id.recyclerview_item:
                // Application logic when whole item long-clicked
                break;
        }
    }
}

And in your xml file don't forget to assign ID to you views. Because we're detecting clicked view with their IDs.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/recyclerview_item"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/web_view"
        android:layout_width="wrap_content"
        android:layout_height="match_parent"/>

    <ImageView
        android:id="@+id/paper_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>

</RelativeLayout>
Farid
  • 2,317
  • 1
  • 20
  • 34