2017-07-25 10 views
1

私はpokedexアプリケーションを作成していますが、選択したポケモンのデータを別のアクティビティ(詳細を表示する)に渡してしまいます。問題は、別のポケモンを選択しても、他のアクティビティ(リストの最初の値、この場合はbulbasaur)に同じ値を送信し続けることです。選択した値を別のアクティビティに渡します(recycleview/textViewを使用)

リストは、リサイクルビュー、textView、およびimageViewで構成されています。他のアクティビティに送信するデータとしてtextViewの値を使用します。

私は画像をクリックすると、選択したポケモンから正しい名前(textView)を他のアクティビティに渡したいと思います。そして私は何が欠けているかわからない。

ありがとうございます!


アダプタコード

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

最初のアクティビティ(一覧)

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

のXmlレイアウトファイル(最初のアクティビティ)

<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"/> 


(画像とテキストを示す)は、XMLレイアウトファイル

<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活性

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

答えて

1

ようですが、このように動作しませんViewHolder itemView.OnClickListner(設定クラス)アダプタに

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

申し訳ありませんが、情報をありがとう、私はそれを試してみましょう! –

+0

それは働いた!ありがとうございました!!! –

0
あなたの第二の活動で

、交換してください:

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

によって:

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

解明:あなたの最初の活動で 、あなたはテントに文字列を渡すので、あなたはgetIntent().getStringExtraことによってそれを取得する必要があります。

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

:バンドルで渡さ

getIntent().getExtras()リターン。 pokemon_onClick()が呼び出されると、findViewByIdは、IDが、pokemonTextViewがのビューの最初の出現を返します。そのため、2番目のアクティビティで同じ値を受け取っているのです。

最も簡単な解決策は、ViewHolderでonClickListenerを実装し、そこから2番目のアクティビティを直接開始することです。

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

もう少し複雑ですが、よりよい解決策は、インターフェイスを作成し、あなたの活動の内部コールバックをクリックし処理するために、次のようになります。

は、アダプタ内のインターフェイスを作成し、セッターを提供します。

private PokemonClickListener listener; 

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

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

が実装OnClickListener上記のようにViewHolderでは、第2アクティビティを開始する代わりにコールリスナメソッドを使用します。

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

あなたのacitivtyでは、PokemonClickListenerを実装し、リスナーをアダプタに設定します。

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