Dep
Dep

Reputation: 183

Recyclerview button on specific row - how to capture row id before onclicklistener?

Below is my adapter class and view code, where I am showing 2 buttons for each of the row. I have setup 2 diff listeners for each button.

New to android, I am not sure, how to get the getbarCode() (sort of row id) for the specific row button clicked? (This I want to use to set the barcode b4 I call my webservices). Currently I have hardcoded in code, I want to get it from my Books getbarCode().

Any suggestions?

BookListMyAdapter.java

package com.androidatc.customviewindrawer;

import android.app.Activity;
import android.app.ProgressDialog;
import android.support.v7.widget.CardView;
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.Button;
import android.widget.ImageView;
import android.widget.ProgressBar;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestHandle;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.TextHttpResponseHandler;

import java.util.List;

import cz.msebera.android.httpclient.Header;

public class BookListMyAccAdapter extends RecyclerView.Adapter<BookListMyAccAdapter.PersonViewHolder> {

    public static class PersonViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {

        CardView cv;
        TextView title;
        TextView dueDt;
        final ProgressDialog progress;

        //        ImageView personPhoto;
        public Button searchBtn, renewBtn, returnBtn;

        PersonViewHolder(View itemView) {
            super(itemView);
//            itemView.setOnClickListener(this);
            cv = (CardView) itemView.findViewById(R.id.cv);
            title = (TextView) itemView.findViewById(R.id.title);
            dueDt = (TextView) itemView.findViewById(R.id.dueDate);
//            personPhoto = (ImageView)itemView.findViewById(R.id.person_photo);
            renewBtn = (Button) itemView.findViewById(R.id.renew_button);
            returnBtn = (Button) itemView.findViewById(R.id.checkin_button);

            renewBtn.setOnClickListener(this);    // <- This lines
            returnBtn.setOnClickListener(this);   // <- This lines

            progress = new ProgressDialog(myActivity);
        }

        @Override
            public void onClick(View itemView) {
                switch (itemView.getId()) {
                    case R.id.checkin_button:
                        String barCode = null, patronId = null;
                        Log.d("TAG", "Success");
//                        Toast.makeText(myActivity.getApplicationContext(), "B4 calling webservice", Toast.LENGTH_LONG).show();
                        returnBook(barCode, patronId, progress);
                        break;

                    case R.id.renew_button:
                        barCode = null;
                        patronId = null;
                        Log.d("TAG", "Success");
//                        Toast.makeText(myActivity.getApplicationContext(), "B4 calling webservice", Toast.LENGTH_LONG).show();
                        renewBook(barCode, patronId, progress);
                        break;
                }
        }}

        List<Books> books;
    public static Activity myActivity;


        BookListMyAccAdapter(List<Books> books, Activity myActivity) {
            this.books = books;
            this.myActivity = myActivity;
        }

        @Override
        public void onAttachedToRecyclerView(RecyclerView recyclerView) {
            super.onAttachedToRecyclerView(recyclerView);
        }

        @Override
        public PersonViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
            View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.item_my_acc, viewGroup, false);
            PersonViewHolder pvh = new PersonViewHolder(v);
            return pvh;
        }

        @Override
        public void onBindViewHolder(PersonViewHolder personViewHolder, int i) {
            personViewHolder.title.setText(books.get(i).title);
            personViewHolder.dueDt.setText(books.get(i).dueOn);
//        personViewHolder.personPhoto.setImageResource(books.get(i).photoId);
        }

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

        public static void renewBook(String barCode, String patronId, final ProgressDialog progress) {
            final int DEFAULT_TIMEOUT = 200000 * 1000000000;

            try {
                // Make RESTful webservice call using AsyncHttpClient object
                AsyncHttpClient client = new AsyncHttpClient();
                client.setTimeout(DEFAULT_TIMEOUT);

                progress.setMessage("Please Wait...");
                progress.setIndeterminate(false);
                progress.setCancelable(false);
                progress.show();

                RequestParams params = new RequestParams();
                params.put("barcode", "B1246857");
                //B1246857
                //B1246855
                params.put("patron", "thida");

//                Toast.makeText(myActivity.getApplicationContext(), "B4 calling webservice", Toast.LENGTH_LONG).show();

                client.post(" http:tron_id=2&item=1", new TextHttpResponseHandler() {
                            @Override
                            public void onSuccess(int i, Header[] headers, String response) {
                                Toast.makeText(myActivity.getApplicationContext(), "Response renew: " + response, Toast.LENGTH_LONG).show();
                                Log.d("TAG", "Success");
                                progress.dismiss();
                            }

                            @Override
                            public void onFailure(int statusCode, Header[] headers, String response, Throwable error) {
                                Toast.makeText(myActivity.getApplicationContext(), "Status code :" + statusCode + "errmsg : " + error.getMessage(), Toast.LENGTH_LONG).show();
//                                Toast.makeText(myActivity.getApplicationContext(), "Unexpected Error occcured! [Most common Error: Device might not be connected to Internet or remote server is not up and running]", Toast.LENGTH_LONG).show();
                                Log.d("TAG", "Failure");
                                progress.dismiss();
                            }

                        }
                );
            } catch (Exception e) {
                e.printStackTrace();
                //illegal argument exception
                Toast.makeText(myActivity.getApplicationContext(), "Exception Caught" + e.toString(), Toast.LENGTH_LONG).show();
            }

//            progress.dismiss();
//            Toast.makeText(myActivity.getApplicationContext(), "After calling webservice renew", Toast.LENGTH_LONG).show();
        }

item_my_acc.xml

<?xml version="1.0" encoding="utf-8"?>
<android.support.v7.widget.CardView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/cv"
    >

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:padding="16dp"
        >

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/title"
            android:layout_gravity="left"
            />

        <TextView
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:id="@+id/dueDate"
            android:layout_below="@+id/title"
            />
        <Button
            android:id="@+id/renew_button"
            android:layout_alignParentRight="true"
            android:text="@string/renew"
            android:layout_below="@id/dueDate"
            android:layout_width="90dp"
            android:layout_height="40dp"
            android:layout_gravity="right"/>

        <Button
            android:id="@+id/checkin_button"
            android:layout_alignParentRight="true"
            android:text="@string/checkin"
            android:layout_below="@id/renew_button"
            android:layout_width="90dp"
            android:layout_height="40dp"
            android:layout_gravity="right"/>


    </RelativeLayout>

</android.support.v7.widget.CardView>

RecyclerMyAccFrag.java

package com.androidatc.customviewindrawer;

import android.app.Fragment;
import android.app.ProgressDialog;
import android.net.Uri;
import android.os.Bundle;
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.Button;
import android.widget.TextView;
import android.widget.Toast;

import com.loopj.android.http.AsyncHttpClient;
import com.loopj.android.http.AsyncHttpResponseHandler;
import com.loopj.android.http.RequestParams;
import com.loopj.android.http.TextHttpResponseHandler;

import org.w3c.dom.Document;
import org.w3c.dom.NodeList;
import org.xml.sax.InputSource;
import org.xml.sax.SAXException;

import java.io.IOException;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;

import cz.msebera.android.httpclient.Header;

public class RecyclerMyAccFrag extends Fragment
//        implements View.OnClickListener
{

    public List<Books> books;
    public RecyclerView rv;
    public TextView formatTxt, contentTxt, TitleTxt, PublisherTxt, CreatorTxt, AvailabiltyTxt;
    public Button searchBtn,renewBtn, returnBtn;
    ProgressDialog progress;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {

        View rootView = inflater.inflate(R.layout.recycler_my_acc, container, false);


//        renewBtn = (Button) rootView.findViewById(R.id.renew_button);
//        returnBtn = (Button) rootView.findViewById(R.id.checkin_button);

//        renewBtn.setOnClickListener(this);
//        returnBtn.setOnClickListener(this);
        String response =getArguments().getString("book_xml");

        rv=(RecyclerView)rootView.findViewById(R.id.rv);

        LinearLayoutManager llm = new LinearLayoutManager(getActivity());
        rv.setLayoutManager(llm);
        rv.setHasFixedSize(true);

//        progress = new ProgressDialog(getActivity());

        readDetails(response);
        initializeAdapter();

        return rootView;
    }


    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        public void onFragmentInteraction(Uri uri);
    }


    public void initializeData(String[] titles, String [] dueDts, int total, String [] barCode){
        books = new ArrayList<>();

        for(int i = 0;i<total;i++)
        {
            books.add(new Books(titles[i], dueDts[i], barCode[i]));
//            Toast.makeText(getActivity().getApplicationContext(), "Title : " + i +
//                    " " + titles[i] + " Due Date: " + dueDts[i], Toast.LENGTH_LONG).show();
        }
        Toast.makeText(getActivity().getApplicationContext(), "Total Number of Books Found:"
                + total , Toast.LENGTH_LONG).show();
    }

    public void initializeAdapter(){
        BookListMyAccAdapter adapter = new BookListMyAccAdapter(books, getActivity());
        rv.setAdapter(adapter);
    }

Books.java

package com.androidatc.customviewindrawer;

class Books {
    String title;
    String dueOn;

    public String getBarCode() {
        return barCode;
    }

    public void setBarCode(String barCode) {
        this.barCode = barCode;
    }

    //    int photoId;
    String barCode;

    Books(String title, String dueOn, String barCode) {
        this.title = title;
        this.dueOn = dueOn;
        this.barCode = barCode;
//        this.photoId = photoId;
    }
}

Upvotes: 0

Views: 256

Answers (1)

aelimill
aelimill

Reputation: 1015

You need getAdapterPosition() (https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition())

And then get the access (or path the event) List<Books> books; in your adapter. The easiest way (if you do not need your ViewHolder as static class) is making it just public class and so you will get access as the inner class of the adapter.

Upvotes: 2

Related Questions