2016-02-12 43 views
0

下面是我的適配器類和視圖代碼,其中我爲每行顯示了2個按鈕。我爲每個按鈕設置了2個diff偵聽器。特定行上的Recyclerview按鈕 - 如何在onclicklistener之前捕獲行ID?

剛接觸android時,我不確定如何獲取getbarCode()(某種行ID)的特定行按鈕被點擊? (這個我想用來設置我打電話給我的web服務的條形碼b4)。目前我已在代碼中硬編碼,我想從我的書籍getbarCode()中獲得它。

有什麼建議嗎?

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

回答

2

你需要getAdapterPosition()https://developer.android.com/reference/android/support/v7/widget/RecyclerView.ViewHolder.html#getAdapterPosition()

,然後讓你的適配器連接(或路徑事件)List<Books> books;。 最簡單的方法(如果你不需要你的ViewHolder作爲靜態類)使它只是public class,所以你將作爲適配器的內部類訪問。

+0

謝謝,讓我試試看。 – Dep

+0

你能告訴我 - 如何「獲取訪問(或路徑事件)列表書籍;在你的適配器」?我無法找到。 – Dep

+0

明白了。非常感謝!! – Dep

相關問題