Reputation: 183
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
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