2016-04-08 14 views
1

Ich kann alle Elemente in der App wie erforderlich anzeigen, aber während OnClick-Methode, um den App-Inhalt auf Facebook zu teilen, zeigt es die falschen Elemente in Bezug auf das Element geklickt. Ich bekomme das Bild, die Überschrift und andere ähnliche Dinge, aber die falsche Adapterposition wird angezeigt. z.B. Wenn ich auf die dritte Position klicke, wird das Ergebnis des vierten Artikels in der Recycleransicht angezeigt. Kann mich irgendjemand durch das führen, was ich hier falsch mache?Recyclerview liefert falsche Position auf onClick-Methode

Unten ist mein Adapter Code:

private LayoutInflater inflater; 
Context context; 
Uri uri; 
String str_uri; 
List<Data> dataArray; 
private int lastPosition = -1; 

public RecyclerViewAdapter(Context context) { 
    //this.dataArray = dataArray; 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
} 

public void setDataArray(List<Data> dataArray) { 
    this.dataArray = dataArray; 

} 

@Override 
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, null); 
    View view = inflater.inflate(R.layout.cardview, parent, false); 
    CustomViewHolder holder = new CustomViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(CustomViewHolder holder, int position) { 
    Data current = dataArray.get(position); 
    holder.textView1.setText(current.heading); 
    holder.textView2.setText(current.date); 
    holder.textView3.setText(current.brief); 

    // Using picasso to fetch image as the user scrolls down ... No need to store 
    // all the images during start up. 

    uri = Uri.parse(current.getLImage()); 
    if (current.getLlImage() == null || current.getLlImage().equalsIgnoreCase("null")) { 
     Picasso.with(this.context).cancelRequest(holder.image); 
     holder.image.setVisibility(View.GONE); 
     HomeActivity.setParameters(current.heading, current.date, current.brief, uri); 
     setAnimation(holder.relativeLayout, position); 

    } else { 
     Picasso.with(context).load(uri).into(holder.image); 
     HomeActivity.setParameters(current.heading, current.date, current.brief, uri); 
     // Animation 
     setAnimation(holder.relativeLayout, position); 
    } 

} 

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


public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    ImageView image, facebook_Sharing; 
    RelativeLayout relativeLayout; 
    TextView textView1, textView2, textView3; 

    public CustomViewHolder(View itemView) { 
     super(itemView); 
     textView1 = (TextView) itemView.findViewById(R.id.heading); 
     textView2 = (TextView) itemView.findViewById(R.id.date); 
     textView3 = (TextView) itemView.findViewById(R.id.brief); 
     image = (ImageView) itemView.findViewById(R.id.imageView); 
     facebook_Sharing = (ImageView) itemView.findViewById(R.id.facebook_Sharing); 
     facebook_Sharing.setOnClickListener(this); 
     relativeLayout = (RelativeLayout) itemView.findViewById(R.id.Relative); 
    } 

    @Override 
    public void onClick(View v) { 

     Intent intent = new Intent(context.getApplicationContext(), HomeActivity.class); 
     intent.putExtra("adapterPosition", getAdapterPosition()); 
     context.startActivity(intent); 
    } 
} 


private void setAnimation(View viewToAnimate, int position) { 
    // If the bound view wasn't previously displayed on screen, it's animated 

    if (position > lastPosition || position < lastPosition) { 

     Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); 
     viewToAnimate.startAnimation(animation); 
     lastPosition = position; 
    } 

} 

Unten ist der Code Aktivität Facebook:

protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    FacebookSdk.sdkInitialize(getApplicationContext()); 
    setContentView(R.layout.home); 
    share = (Button) findViewById(R.id.share); 

    callbackManager = CallbackManager.Factory.create(); 
    facebookLogin = (LoginButton) findViewById(R.id.login_button); 
    facebookLogin.registerCallback(callbackManager, callback); 
    shareDialog = new ShareDialog(this); 
    // login.setReadPermissions("public_profile email"); 

    share.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 

      ShareLinkContent content = new ShareLinkContent.Builder() 
        .setContentTitle(heading1) 
        .setContentDescription(brief1) 
        .setContentUrl(Uri.parse(String.valueOf(imageView1))).build(); 
      shareDialog.show(content); 
     } 
    }); 

} 

public static void setParameters(String heading, String date, String brief, Uri imageView) { 

    heading1 = heading; 
    date1 = date; 
    brief1 = brief; 
    System.out.println("BBBBBBBBBBBBBBBBBBBB is ::::::::: " + brief1); 
    imageView1 = imageView; 
} 
@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    callbackManager.onActivityResult(requestCode, resultCode, data); 
} 
+0

meinen Code versuchen, mit Position zu Ihrer Ansicht verwendet tag:

public static List<Data> dataArray; 

Und innerhalb Facebook Aktivität onClick Hörer sollte dataarray direcly wie zugegriffen werden. – appukrb

Antwort

1

diesen Code Versuchen Sie, ich Satz Tag auf Ihre facebook_Sharing Ansicht und Position erhalten auf onclik()

private LayoutInflater inflater; 
Context context; 
Uri uri; 
String str_uri; 
List<Data> dataArray; 
private int lastPosition = -1; 

public RecyclerViewAdapter(Context context) { 
    //this.dataArray = dataArray; 
    this.context = context; 
    inflater = LayoutInflater.from(context); 
} 

public void setDataArray(List<Data> dataArray) { 
    this.dataArray = dataArray; 

} 

@Override 
public CustomViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 
    // View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.cardview, null); 
    View view = inflater.inflate(R.layout.cardview, parent, false); 
    CustomViewHolder holder = new CustomViewHolder(view); 
    return holder; 
} 

@Override 
public void onBindViewHolder(CustomViewHolder holder, int position) { 
    Data current = dataArray.get(position); 
    holder.textView1.setText(current.heading); 
    holder.textView2.setText(current.date); 
    holder.textView3.setText(current.brief); 
    holder.facebook_Sharing.setTag("" + position); 
    // Using picasso to fetch image as the user scrolls down ... No need to store 
    // all the images during start up. 

    uri = Uri.parse(current.getLImage()); 
    if (current.getLlImage() == null || current.getLlImage().equalsIgnoreCase("null")) { 
     Picasso.with(this.context).cancelRequest(holder.image); 
     holder.image.setVisibility(View.GONE); 
     HomeActivity.setParameters(current.heading, current.date, current.brief, uri); 
     setAnimation(holder.relativeLayout, position); 

    } else { 
     Picasso.with(context).load(uri).into(holder.image); 
     HomeActivity.setParameters(current.heading, current.date, current.brief, uri); 
     // Animation 
     setAnimation(holder.relativeLayout, position); 
    } 

} 

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


public class CustomViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
    ImageView image, facebook_Sharing; 
    RelativeLayout relativeLayout; 
    TextView textView1, textView2, textView3; 

    public CustomViewHolder(View itemView) { 
     super(itemView); 
     textView1 = (TextView) itemView.findViewById(R.id.heading); 
     textView2 = (TextView) itemView.findViewById(R.id.date); 
     textView3 = (TextView) itemView.findViewById(R.id.brief); 
     image = (ImageView) itemView.findViewById(R.id.imageView); 
     facebook_Sharing = (ImageView) itemView.findViewById(R.id.facebook_Sharing); 
     facebook_Sharing.setOnClickListener(this); 
     relativeLayout = (RelativeLayout) itemView.findViewById(R.id.Relative); 
    } 

    @Override 
    public void onClick(View v) { 
     int pos = Integer.parseInt("" + v.getTag()); 
     Intent intent = new Intent(context.getApplicationContext(), HomeActivity.class); 
     intent.putExtra("adapterPosition", pos); 
     context.startActivity(intent); 
    } 
} 


private void setAnimation(View viewToAnimate, int position) { 
    // If the bound view wasn't previously displayed on screen, it's animated 

    if (position > lastPosition || position < lastPosition) { 

     Animation animation = AnimationUtils.loadAnimation(context, android.R.anim.slide_in_left); 
     viewToAnimate.startAnimation(animation); 
     lastPosition = position; 
    } 

} 
+0

Nopes, es funktioniert nicht, Einfügen des 2. Elements jetzt! – Umair

+1

Perfekte Antwort. Habe meinen Tag gerettet. Vielen Dank. –

0

Falls jemand zu diesem speziellen Problem kommt, kann ihm diese Lösung helfen.

Wenn Sie DataArray statisch machen und den Inhalt direkt im Inhaltsmodul verwenden, wird dieses Problem behoben. In Adapterklasse sollte dataarray deklariert werden als:

share.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View view) { 
      ShareLinkContent content = new ShareLinkContent.Builder() 
        .setContentTitle(JSONAsync.dataArray.get(adapterPosition).heading) 
        .setContentDescription(JSONAsync.dataArray.get(adapterPosition).brief) 
        .setImageUrl(Uri.parse(JSONAsync.dataArray.get(adapterPosition).getLImage())) 
        .setContentUrl(Uri.parse(String.valueOf(Uri.parse(JSONAsync.dataArray.get(adapterPosition).getNews())))).build(); 
      shareDialog.show(content); 
     } 
    }); 
Verwandte Themen