2016-10-18 1 views
1

J'utilise une vue recycleur pour lister les offres de prix d'un serveur. Dans l'adaptateur de recycleur, j'essaie d'obtenir l'ID de l'enregistrement de prix en cliquant ou en tapant sur la ligne correspondante. Inside onCreateViewHolder. Lorsque je tape sur la mise en page relative qui contient la ligne, je reçois toujours le même ID (qui est le premier ID retourné par le serveur) bien que j'obtienne toutes les lignes correctement du serveur. Qu'est-ce qui cause cela? est-ce la mise en cache? et comment le résoudre.Obtention du même ID lorsque vous cliquez sur la disposition des lignes dans la vue recycleur (Android)

C'est mon code

@Override 
public ListViewPriceListRowHolder onCreateViewHolder(final ViewGroup viewGroup, int position) { 
    View itemView = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.text_fragment, viewGroup, false); 

    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.price_list_row,null); 
    ListViewPriceListRowHolder holder = new ListViewPriceListRowHolder(v); 
    holder.rellayout.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      priceID = (TextView)viewGroup.findViewById(R.id.tv_price_row); 
      String priceIDStr = priceID.getText().toString(); 
      //here I am getting the same price id every time I click on diiferent row 
      Toast.makeText(mContext,priceIDStr,Toast.LENGTH_SHORT).show(); 
      } 
    }); 
    // return new ListViewRowHolder(itemView); 
    return holder; 
} 

Mon ViewHolder

package com.mdawaina.helper; 

import android.support.v7.widget.RecyclerView; 
import android.view.View; 
import android.widget.RelativeLayout; 
import android.widget.TextView; 

import com.android.volley.toolbox.NetworkImageView; 
import com.mdawaina.swftcc.R; 

public class ListViewPriceListRowHolder extends RecyclerView.ViewHolder { 

public NetworkImageView thumbnail ; 
public TextView priceID; 
public TextView orderID; 
public TextView SPName; 
public TextView catID; 
public TextView price; 
public TextView orderDetailsSuply; 
public TextView approve; 
public RelativeLayout rellayout; 

public ListViewPriceListRowHolder(View view){ 
    super(view); 

    this.priceID = (TextView) view.findViewById(R.id.tv_price_id_row); 
    this.orderID = (TextView) view.findViewById(R.id.tv_order_id_row); 
    this.SPName = (TextView) view.findViewById(R.id.tv_sp_name_row); 
    this.catID = (TextView)view.findViewById(R.id.tv_cat_id_row); 
    this.price = (TextView)view.findViewById(R.id.tv_price_row); 
    this.orderID = (TextView)view.findViewById(R.id.tv_order_id_row); 
    this.orderDetailsSuply =   (TextView)view.findViewById(R.id.tv_orderdetailsuplly_row); 
    this.approve = (TextView)view.findViewById(R.id.tv_approve_row); 
    this.rellayout = (RelativeLayout) view.findViewById(R.id.pl_rellayout); 

    view.setClickable(true); 
} 
} 

Ma mise en page de la ligne

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:padding="20dp" 
android:id="@+id/pl_rellayout" 
android:background="#FFF" 
> 
<com.android.volley.toolbox.NetworkImageView 
    android:layout_width="80dp" 
    android:layout_height="80dp" 
    android:id="@+id/networkImage" 
    android:scaleType="fitXY" 
    android:layout_alignParentTop="true" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="The Title Goes Here" 
    android:textColor="@color/blue" 


    android:textSize="18dp" 
    android:maxLines="2" 
    android:id="@+id/tv_sp_name_row" 
    android:paddingEnd="5dp" 
    android:paddingRight="5dp" 
    android:textColorHighlight="@color/colorPrimary" 
    android:shadowColor="@color/colorPrimaryDark" 
    android:shadowDx="3.4" 
    android:shadowDy="2.5" 
    android:layout_marginLeft="130dp" 
    android:layout_alignParentTop="true" 
    android:layout_alignRight="@+id/tv_price_row" 
    android:layout_alignEnd="@+id/tv_price_row" /> 

    <TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="14500000" 
    android:id="@+id/tv_price_row" 

    android:layout_alignBottom="@+id/networkImage" 

    android:layout_alignRight="@id/location_icon_row" 
    android:layout_alignEnd="@id/location_icon_row" 
    android:layout_marginRight="35dp" 
    android:layout_marginBottom="10dp" 
    /> 

<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="التفاصيل" 
    android:id="@+id/tv_orderdetailsuplly_row" 
    android:maxLines="10" 

    android:layout_below="@+id/tv_price_row" 
    android:layout_marginTop="5dp" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="35dp" 
    android:layout_marginLeft="10dp" 
    /> 

<Button 
    style="?android:attr/buttonStyleSmall" 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="قبول العرض" 
    android:id="@+id/btnAcceptOffer" 

    android:background="@color/lightBlue" 
    android:textColor="@color/white" 
    android:layout_below="@+id/tv_orderdetailsuplly_row" 
    android:layout_marginTop="10dp" 
    android:layout_alignParentRight="true" 
    android:layout_marginRight="35dp" 
    android:layout_marginLeft="10dp" 

    android:shadowRadius="@integer/google_play_services_version" 

/> 


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="URL" 
    android:id="@+id/tv_cat_id_row" 
    android:maxLines="0" 
    android:layout_alignBottom="@+id/networkImage" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginLeft="35dp" 
    android:layout_marginStart="35dp" /> 


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="URL" 
    android:id="@+id/tv_order_id_row" 
    android:maxLines="0" 
    android:layout_alignBottom="@+id/networkImage" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginLeft="35dp" 
    android:layout_marginStart="35dp" /> 


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="URL" 
    android:id="@+id/tv_price_id_row" 
    android:maxLines="0" 
    android:layout_alignBottom="@+id/networkImage" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginLeft="35dp" 
    android:layout_marginStart="35dp" /> 


<TextView 
    android:layout_width="wrap_content" 
    android:layout_height="wrap_content" 
    android:text="URL" 
    android:id="@+id/tv_approve_row" 
    android:maxLines="0" 
    android:layout_alignBottom="@+id/networkImage" 
    android:layout_alignParentLeft="true" 
    android:layout_alignParentStart="true" 
    android:layout_marginLeft="35dp" 
    android:layout_marginStart="35dp" /> 

<ImageView 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:id="@+id/location_icon_row" 
    android:src="@drawable/ic_price_tag" 
    android:layout_alignBottom="@+id/networkImage" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    /> 


<ImageView 
    android:layout_width="30dp" 
    android:layout_height="30dp" 
    android:id="@+id/details_icon_row" 
    android:src="@drawable/ic_order_long_text" 
    android:layout_below="@+id/location_icon_row" 
    android:layout_alignParentRight="true" 
    android:layout_alignParentEnd="true" 
    /> 



</RelativeLayout> 
+0

S'il vous plaît poster la mise en œuvre de onBindViewHolder() ainsi. Vous devez définir l'écouteur de clic dans onBindViewHolder(). –

+0

Oui, je l'ai mis sur onBindViewHolder() dès maintenant et a travaillé pour moi :). Merci Sagar Trehan – mdawaina

Répondre

0

OnCreateViewHolder Je crois que est appelé une fois par différents types de supports de vues qu'ils obtiennent ajouté à la liste. Vous pouvez déplacer l'écouteur de clic vers la méthode onBindViewHolder et utiliser la position et le support transmis pour obtenir le bon élément dans votre liste.

Quelque chose comme cela devrait fonctionner:

@Override 
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) { 
    (ListViewPriceListRowHolder) holder.itemView.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      String id = holder.priceId.getText().toString() 
      // do stuff with the id 
     } 
    }); 
} 
+0

Cela a fonctionné pour moi :). Merci Le2e410 pour votre réponse – mdawaina

+0

@mdawaina: Si la réponse ci-dessus vous aide à résoudre votre problème. Ensuite, il est bon d'accepter la réponse ci-dessus –

0

Essayez ceci:

@Override 
public ListViewPriceListRowHolder onCreateViewHolder(final ViewGroup viewGroup, int position) { 
    View v = LayoutInflater.from(viewGroup.getContext()).inflate(R.layout.price_list_row,null); 
    return v; 
} 



public class MyViewHolder extends RecyclerView.ViewHolder { 

    public NetworkImageView thumbnail ; 
    public TextView priceID; 
    public TextView orderID; 
    public TextView SPName; 
    public TextView catID; 
    public TextView price; 

    public TextView orderDetailsSuply; 
    public TextView approve; 
    public RelativeLayout rellayout; 


    public MyViewHolder(final View view) { 
     super(view); 
     priceID = (TextView) view.findViewById(R.id.tv_price_id_row); 
     orderID = (TextView) view.findViewById(R.id.tv_order_id_row); 
     SPName = (TextView) view.findViewById(R.id.tv_sp_name_row); 
     catID = (TextView)view.findViewById(R.id.tv_cat_id_row); 
     price = (TextView)view.findViewById(R.id.tv_price_row); 
     orderID = (TextView)view.findViewById(R.id.tv_order_id_row); 
     orderDetailsSuply=(TextView)view.findViewById(R.id.tv_orderdetailsuplly_row); 
     approve = (TextView)view.findViewById(R.id.tv_approve_row); 
     rellayout = (RelativeLayout) view.findViewById(R.id.pl_rellayout); 
     rellayout.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       priceID = (TextView)viewGroup.findViewById(R.id.tv_price_row); 
       String priceIDStr = priceID.getText().toString(); 
       //here I am getting the same price id every time I click on diiferent row 
       Toast.makeText(mContext,priceIDStr,Toast.LENGTH_SHORT).show(); 
       } 
     }); 
    } 
} 
+0

'viewGroup' n'est pas défini dans le constructeur de' MyViewHolder' –