简体   繁体   中英

Onclick button is not working in adapter (Recycler view app)

My Recycler view has 2 buttons: REnew and Return. Both are not working.

Understand that Recycler view cannot implement the onclick, so I implemented the same in Adapter. In the Adapter - I added a toast msg to test of if the button onclick is captured, it is not showing.

Can anyone suggest, what's the reason? Let me know if you need to see more code.

Many thanks.

BookListMyAccAdapter.java

package com.androidatc.customviewindrawer;

import android.app.Activity;
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.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 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;

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

        @Override
            public void onClick(View v) {
                switch (v.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);
                        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);
                        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 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", "B1246855");
                params.put("patron", "thida");

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

                client.post(" htt=1", new TextHttpResponseHandler() {
                            @Override
                            public void onSuccess(int i, Header[] headers, String response) {
//                                Toast.makeText(getActivity().getApplicationContext(), "Response: " + response, Toast.LENGTH_LONG).show();
                                Log.d("TAG", "Success");
                            }

                            @Override
                            public void onFailure(int statusCode, Header[] headers, String response, Throwable error) {
//                                Toast.makeText(getActivity().getApplicationContext(), "Status code :" + statusCode + "errmsg : " + error.getMessage(), Toast.LENGTH_LONG).show();
//                                Toast.makeText(getActivity().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");
                            }

                        }
                );
            } catch (Exception e) {
                e.printStackTrace();
//                Toast.makeText(getActivity().getApplicationContext(), "Exception Caught", Toast.LENGTH_LONG).show();
            }

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


        public static void returnBook(String barCode, String patronId) {
            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", "B1246855");
                params.put("patron", "thida");

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

                client.post("http://43.246855", new AsyncHttpResponseHandler() {
                            //                http://koha-dev.cvpl.com
                            @Override
                            public void onSuccess(int i, Header[] headers, byte[] bytes) {
//                                Toast.makeText(getActivity().getApplicationContext(), "Response: " + headers, Toast.LENGTH_LONG).show();
                                Log.d("TAG", "Success");
                            }

                            @Override
                            public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
//                                Toast.makeText(getActivity().getApplicationContext(), "Status code :" + headers + "errmsg : " + throwable.getMessage(), Toast.LENGTH_LONG).show();
//                                Toast.makeText(getActivity().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");
                            }

                        }

                );
            } catch (Exception e) {
                e.printStackTrace();
//                Toast.makeText(getActivity().getApplicationContext(), "Exception Caught", Toast.LENGTH_LONG).show();
            }

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

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){
        books = new ArrayList<>();

        for(int i = 0;i<total;i++)
        {
            books.add(new Books(titles[i], dueDts[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);
    }

// parse XML
    public void readDetails(String response) {
        DocumentBuilder builder = null;

        try {
            builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
            InputSource src = new InputSource();

            src.setCharacterStream(new StringReader(response));
            Document doc = builder.parse(src);

//            NodeList nodes1 = doc.getElementsByTagName("title");
            src.setCharacterStream(new StringReader(response));

           NodeList nodes = doc.getElementsByTagName("date_due_sql");

            int cnt = 0;
//            String[] titles1 = new String[10000];
            String[] titles = new String[10000];
            String[] dueDts = new String[10000];

            for (int i = 0; i < nodes.getLength(); i++) {

                if (nodes.item(i).getTextContent() == "title") {
//                    titles1[i] = doc.getElementsByTagName("title").item(0).getTextContent();

                }

                if (nodes.item(i).getTextContent().trim().isEmpty()) {
                    cnt++;
                }

            }
            Log.e("TAGLOG", "" + cnt);
            for (int i = 0; i < nodes.getLength(); i++) {
                    titles[i] = doc.getElementsByTagName("title").item(i).getTextContent();
                    dueDts[i] = doc.getElementsByTagName("date_due_sql").item(i).getTextContent();
            }

              initializeData(titles, dueDts, nodes.getLength());

//            Toast.makeText(getActivity().getApplicationContext(), "Total Number of Books Found:"
//                    + nodes1.getLength() + " " + titles[0], Toast.LENGTH_LONG).show();
        } catch (ParserConfigurationException e) {
            e.printStackTrace();
        } catch (SAXException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
            Toast.makeText(getActivity().getApplicationContext(), "No Book Found", Toast.LENGTH_LONG).show();
        } finally {

        }
    }


    public void renewBook(String barCode, String patronId)
    {
        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", "B1246855");
            params.put("patron", "thida");

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

            client.post(" http://koha-ded=1", new TextHttpResponseHandler() {
                        @Override
                        public void onSuccess(int i, Header[] headers, String response) {
                            Toast.makeText(getActivity().getApplicationContext(), "Response: " + response, Toast.LENGTH_LONG).show();
                            Log.d("TAG", "Success");
                        }

                        @Override
                        public void onFailure(int statusCode, Header[] headers, String response, Throwable error) {
                            Toast.makeText(getActivity().getApplicationContext(), "Status code :" + statusCode + "errmsg : " + error.getMessage(), Toast.LENGTH_LONG).show();
                            Toast.makeText(getActivity().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");
                        }

                    }
            );
        }
        catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(getActivity().getApplicationContext(), "Exception Caught", Toast.LENGTH_LONG).show();
        }

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



    public void returnBook(String barCode, String patronId)
    {
        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", "B1246855");
            params.put("patron", "thida");

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

            client.post("http:vice46855", new AsyncHttpResponseHandler() {
                        //                http://koha-dev.cvpl.com.sg/cgi-bin/koha/ilsdi.pl?service=RenewLoan&patron_id=1&item_id=1
                        @Override
                        public void onSuccess(int i, Header[] headers, byte[] bytes) {
                            Toast.makeText(getActivity().getApplicationContext(), "Response: " + headers, Toast.LENGTH_LONG).show();
                            Log.d("TAG", "Success");
                        }

                        @Override
                        public void onFailure(int i, Header[] headers, byte[] bytes, Throwable throwable) {
                            Toast.makeText(getActivity().getApplicationContext(), "Status code :" + headers + "errmsg : " + throwable.getMessage(), Toast.LENGTH_LONG).show();
                            Toast.makeText(getActivity().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");
                        }

                    }

            );
        }
        catch (Exception e)
        {
            e.printStackTrace();
            Toast.makeText(getActivity().getApplicationContext(), "Exception Caught", Toast.LENGTH_LONG).show();
        }

        progress.dismiss();
        Toast.makeText(getActivity().getApplicationContext(), "After calling webservice", 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>

Currently your ViewHolder class is implementing View.OnClickListener. That's not going to help here.

Instead, you need to call setOnClickListener on the individual view objects that you would like to receive clicks. If it's just the whole row, you only need to do the root view for that row.

I Think you forgot to add the OnClickListener to your View:

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

    CardView cv;
    TextView title;
    TextView dueDt;

    public Button searchBtn, renewBtn, returnBtn;

    PersonViewHolder(View itemView) {
        super(itemView);

        cv = (CardView) itemView.findViewById(R.id.cv);
        title = (TextView) itemView.findViewById(R.id.title);
        dueDt = (TextView) itemView.findViewById(R.id.dueDate);
        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
    }

    (...)

}

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