2017-07-25 4 views
1

Je crée une application pokedex et je suis bloqué pour transmettre les données du pokemon sélectionné à une autre activité (pour afficher plus de détails). Le problème est qu'il continue à envoyer la même valeur à l'autre activité (la première valeur dans la liste, dans ce cas, bulbasaur) même si je choisis un pokemon différent.Passage de la valeur sélectionnée à une autre activité (en utilisant recycleview/textView)

La liste se compose d'un recycleview, textView et un imageView.Et j'utilise la valeur du textView comme données à envoyer à l'autre activité.

Donc je veux passer le bon nom (textView) du pokemon sélectionné à l'autre activité que je clique sur l'image. Et je ne suis pas sûr de ce qui me manque.

Merci d'avance!


code Adaptateur

public class PokemonListAdapter extends RecyclerView.Adapter<PokemonListAdapter.ViewHolder>{ 

private ArrayList<Pokemon> dataset; 
private Context context; 

public PokemonListAdapter(Context context){ 
    this.context = context; 
    dataset = new ArrayList<>(); 
} 

@Override 
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType){ 
    View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.image_pokemon,            parent,false); 
    return new ViewHolder(view); 
} 

@Override 
public void onBindViewHolder(ViewHolder holder, int position){ 
    Pokemon p = dataset.get(position); 
    holder.pokemonTextView.setText(p.getName()); 

    Glide.with(context).load("http://pokeapi.co/media/sprites/pokemon/" + p.getNumber() + ".png") 
      .centerCrop() 
      .crossFade() 
      .into(holder.pictureImageView); 

} 

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

public void toegevoegdePokemonList(ArrayList<Pokemon> pokemonList) { 
    dataset.addAll(pokemonList); 
    notifyDataSetChanged(); 
} 

public class ViewHolder extends RecyclerView.ViewHolder{ 
    private ImageView pictureImageView; 
    private TextView pokemonTextView; 


    public ViewHolder(View itemView) { 
     super(itemView); 
     pictureImageView = (ImageView) itemView.findViewById(R.id.pictureImageView); 
     pokemonTextView = (TextView) itemView.findViewById(R.id.pokemonTextView); 
    } 
} 

activité première (Liste)

public class Pokedex extends AppCompatActivity { 

private Retrofit retrofit; 
private static final String TAG = "POKEDEX"; 
private RecyclerView recyclerView; 
private PokemonListAdapter pokemonListAdapter; 
private int offset; 
private boolean loaded; 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pokedex); 

    //recycleViewer 
    recyclerView = (RecyclerView) findViewById(R.id.recyclerView); 
    pokemonListAdapter = new PokemonListAdapter(this); 
    recyclerView.setAdapter(pokemonListAdapter); 
    recyclerView.setHasFixedSize(true); 

    //grid 
    final GridLayoutManager layoutManager = new GridLayoutManager(this, 3); 
    recyclerView.setLayoutManager(layoutManager); 
    recyclerView.addOnScrollListener(new RecyclerView.OnScrollListener() { 
     @Override 
     public void onScrolled(RecyclerView recyclerView, int dx, int dy) { 
      super.onScrolled(recyclerView, dx, dy); 

      if(dy > 0){ 
       int visibleItemCount = layoutManager.getChildCount(); 
       int totalItemCount = layoutManager.getItemCount(); 
       int partVisible = layoutManager.findFirstVisibleItemPosition(); 

       if(loaded){ 
        if((visibleItemCount + partVisible) >= totalItemCount){ 
         Log.i(TAG, "Final"); 
         loaded = false; 
         offset += 20; 
         getDataPokemon(offset); 
        } 
       } 
      } 
     } 
    }); 

    //retrofit 
    retrofit = new Retrofit.Builder() 
      .baseUrl("http://pokeapi.co/api/v2/") 
      .addConverterFactory(GsonConverterFactory.create()) 
      .build(); 

    loaded = true; 
    offset = 0; 

    getDataPokemon(offset); 
} 


//method 
private void getDataPokemon(int offset) { 
    apiService service = retrofit.create(apiService.class); 
    Call<PokemonRequest> pokemonRequestCall = service.getPokemonList(20, offset); 

    pokemonRequestCall.enqueue(new Callback<PokemonRequest>() { 
     @Override 
     public void onResponse(Call<PokemonRequest> call, Response<PokemonRequest> response) { 
      loaded = true; 
      if (response.isSuccessful()) { 

       PokemonRequest pokemonRequest = response.body(); 
       ArrayList<Pokemon> pokemonList = pokemonRequest.getResults(); 

       pokemonListAdapter.toegevoegdePokemonList(pokemonList); 

      } else { 
       Log.e(TAG, "onResponse: " + response.errorBody()); 
      } 
     } 

     @Override 
     public void onFailure(Call<PokemonRequest> call, Throwable t) { 
      loaded = true; 
      Log.e(TAG, "onFailure: " + t.getMessage()); 
     } 

    }); 
} 


public void pokemon_onClick(View v) 
{ 
    TextView textView = (TextView)findViewById(R.id.pokemonTextView); 
    Intent intent = new Intent(); 
    intent.putExtra("pokemonName", textView.getText().toString()); 
    intent.setClass(this, PokemonDetail.class); 
    startActivity(intent); 
} 

fichier de mise en page de Xml (première activité)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:app="http://schemas.android.com/apk/res-auto" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
tools:context="be.thomasmore.project_idexv2.Pokedex"> 

<android.support.v7.widget.RecyclerView 
    android:id="@+id/recyclerView" 
    android:layout_height="match_parent" 
    android:layout_width="match_parent"/> 


fichier xml de mise en page (ce qui montre l'image et le texte)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:orientation="vertical" android:layout_width="match_parent" 
android:layout_height="wrap_content"> 

<ImageView 
    android:id="@+id/pictureImageView" 
    android:layout_width="96dp" 
    android:layout_height="96dp" 
    android:layout_gravity="center_horizontal" 
    android:onClick="pokemon_onClick"/> 

<TextView 
    android:id="@+id/pokemonTextView" 
    android:layout_width="match_parent" 
    android:layout_height="wrap_content" 
    android:text="@string/app_name" 
    android:gravity="center_horizontal"/> 
    <!--android:textAllCaps="true"--> 


2ème activité

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_pokemon_detail); 

    String pokemon = getIntent().getExtras().getString("pokemonName"); 
    TextView textView = (TextView)findViewById(R.id.pokemonName); 
    textView.setText(pokemon); 
} 

Répondre

1

Il ne fonctionne pas de cette façon. Lorsque pokemon_onClick() est appelée, la propriété findViewById renvoie la première occurrence de l'affichage avec l'ID pokemonTextView. C'est pourquoi vous recevez la même valeur dans votre deuxième activité.

La solution la plus simple consiste à implémenter onClickListener dans votre ViewHolder et à démarrer la 2ème activité directement à partir de là.

public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { 
     private ImageView pictureImageView; 
     private TextView pokemonTextView; 

    public ViewHolder(View itemView) { 
     super(itemView); 

     itemView.setClickable(true); 
     itemView.setOnClickListener(this); 

     pictureImageView = (ImageView) itemView.findViewById(R.id.pictureImageView); 
     pokemonTextView = (TextView) itemView.findViewById(R.id.pokemonTextView); 
    } 

    @Override 
    public void onClick(View v) { 
     Intent intent = new Intent(context, PokemonDetail.class); 
     intent.putExtra("pokemonName", dataset.get(getAdapterPosition()).getName()); 
     context.startActivity(intent); 
    } 
} 

peu plus complexe, mais une meilleure solution serait de créer une interface et poignée cliquez callbacks dans votre activité:

Créer une interface à l'intérieur de l'adaptateur et fournir setter:

private PokemonClickListener listener; 

public void setListener(PokemonClickListener listener) { 
    this.listener = listener; 
} 

public interface PokemonClickListener{ 
    void onPokemonClicked(Pokemon pokemon); 
} 

Mettre en œuvre OnClickListener dans ViewHolder comme ci-dessus, mais appelez la méthode d'écouteur au lieu de démarrer la 2ème activité:

@Override 
public void onClick(View v) { 
    if(listener != null){ 
     listener.onPokemonClicked(dataset.get(getAdapterPosition())); 
    } 
} 

Dans votre activité, implémentez PokemonClickListener et définissez l'écouteur sur l'adaptateur.

adapter.setListener(new PokemonClickListener() { 
    @Override 
    public void onPokemonClicked(Pokemon pokemon) { 
     Intent intent = new Intent(this, PokemonDetail.class); 
     intent.putExtra("pokemonName", pokemon.getName()); 
     startActivity(intent); 
    } 
}); 
+0

Très bien, merci pour l'info, je vais l'essayer! –

+0

Ça a marché! Je vous remercie!!! –

0

Dans votre 2ème activité, Replace:

String pokemon = getIntent().getExtras().getString("pokemonName"); 

par:

String pokemon = getIntent().getStringExtra("pokemonName"); 

Explication: Dans votre première activité, vous passez une chaîne dans l'intention, donc vous devez le récupérer par getIntent().getStringExtra.

getIntent().getExtras() retour d'un passé Bundle avec:

Bundle b = new Bundle(); 
b.putString("key", "value"); // put String into the Bundle, not the Intent 
intent.putExtras(b); // Put the Bundle into the Intent 
0

dans votre adaptateur ViewHolder classe mis itemView.OnClickListner() comme

itemView.SetOnClickListner(new OnClickListner) 
{ 
    @override 
    OnClick() 
    { 
    String txt_value = yourText.getText().toString(); 
    Intent i = new Intent(context, NewActivity.class); 
    i.putExtra("txt_value",txt_value); 
    startActivity(i); 
    } 
}