前回の質問から、私はRecyclerViewを使用して自分のAndroidアプリケーションのレシピのリストを表示することを提案しました。RecyclerViewでどのボタンが押されているか確認していますか?
RecyclerViewは正しく動作しています(下のコード)、RecyclerViewの各行にはレシピ名と完全レシピを表示するボタンがあります。しかし、どのボタンが正しいかをチェックする方法と、どのボタンがクリックされたかに基づいてレシピデータを表示するかはわかりません。
「表示」ボタンの1つをクリックすると、アクティビティViewRecipeを起動し、可能であれば、そのレシピの「recipeKey」を新しいアクティビティに送信して、そのデータを取得できますFirebase、またはmRecipes ArrayListでそのレシピのインデックスを取得できる場合は、このインデックスとmRecipesIdsをViewRecipeに渡します。しかし、私はRecylerViewを初めて使用しました。これらの値をどのように取得して新しいアクティビティに送ることができるかわかりません。
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
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.ImageButton;
import android.widget.TextView;
import android.widget.Toast;
import com.google.firebase.database.ChildEventListener;
import com.google.firebase.database.DataSnapshot;
import com.google.firebase.database.DatabaseError;
import com.google.firebase.database.DatabaseReference;
import com.google.firebase.database.FirebaseDatabase;
import com.google.firebase.database.ValueEventListener;
import java.util.ArrayList;
import java.util.List;
public class RecipeListActivity extends AppCompatActivity {
ArrayList<Contact> contacts;
private static final String TAG = "RecipeBook";
private DatabaseReference mRecipeReference;
ValueEventListener mRecipeListener;
RecipeAdapter adapter;
private RecyclerView mRecipeRecycler;
private ImageButton Back;
String recipeKey;
ArrayList<Recipe> recipeMap = new ArrayList<Recipe>();
RecyclerView rvContacts;
private TextView test;
String name;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_recipes);
mRecipeRecycler = (RecyclerView) findViewById(R.id.rvRecipes);
mRecipeReference = FirebaseDatabase.getInstance().getReference().child("likedrecipe");
mRecipeRecycler.setLayoutManager(new LinearLayoutManager(this));
}
@Override
public void onStart() {
super.onStart();
ValueEventListener recipeListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot recipeSnapshot: dataSnapshot.getChildren()) {
Recipe recipe = recipeSnapshot.getValue(Recipe.class);
recipeKey = recipeSnapshot.getKey();
recipe.id = recipeKey;
name = recipe.Name;
recipeMap.add(recipe);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "loadPost:onCancelled", databaseError.toException());
}
};
mRecipeReference.addValueEventListener(recipeListener);
mRecipeListener = recipeListener;
// Listen for comments
adapter = new RecipeAdapter(this, mRecipeReference);
mRecipeRecycler.setAdapter(adapter);
}
@Override
public void onStop() {
super.onStop();
if (mRecipeListener!= null) {
mRecipeReference.removeEventListener(mRecipeListener);
}
//RecipeAdapter.cleanupListener();
}
public static class RecipeViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
public TextView nameTextView;
public Button messageButton;
public RecipeViewHolder(View itemView) {
super(itemView);
nameTextView = (TextView) itemView.findViewById(R.id.contact_name);
messageButton = (Button) itemView.findViewById(R.id.message_button);
messageButton.setOnClickListener(this);
}
@Override
public void onClick(View v) {
if(v.getId() == messageButton.getId()) {
//startActivity(new Intent(this, ViewRecipe.class));
}
}
}
public class RecipeAdapter extends RecyclerView.Adapter<RecipeViewHolder> {
private List<Recipe> mRecipes = new ArrayList<Recipe>();
private List<String> mRecipeIds = new ArrayList<String>();
private Context mContext;
private DatabaseReference mDatabaseReference;
private ChildEventListener mChildEventListener;
public RecipeAdapter(Context context, DatabaseReference ref) {
mContext = context;
mDatabaseReference = ref;
ChildEventListener childEventListener = new ChildEventListener() {
@Override
public void onChildAdded(DataSnapshot dataSnapshot, String previousChildName) {
Log.d(TAG, "onChildAdded:" + dataSnapshot.getKey());
Recipe recipe = dataSnapshot.getValue(Recipe.class);
mRecipeIds.add(dataSnapshot.getKey());
mRecipes.add(recipe);
notifyItemInserted(mRecipes.size() - 1);
// [END_EXCLUDE]
}
@Override
public void onChildChanged(DataSnapshot dataSnapshot, String previousChildName) {
Log.d(TAG, "onChildChanged:" + dataSnapshot.getKey());
Recipe newrecipe = dataSnapshot.getValue(Recipe.class);
String recipeKey = dataSnapshot.getKey();
int recipeIndex = mRecipeIds.indexOf(recipeKey);
if (recipeIndex > -1) {
mRecipes.set(recipeIndex, newrecipe);
notifyItemChanged(recipeIndex);
} else {
Log.w(TAG, "onChildChanged:unknown_child:" + recipeKey);
}
}
@Override
public void onChildRemoved(DataSnapshot dataSnapshot) {
Log.d(TAG, "onChildRemoved:" + dataSnapshot.getKey());
String recipeKey = dataSnapshot.getKey();
int recipeIndex = mRecipeIds.indexOf(recipeKey);
if (recipeIndex > -1) {
mRecipeIds.remove(recipeIndex);
mRecipes.remove(recipeIndex);
notifyItemRemoved(recipeIndex);
} else {
Log.w(TAG, "onChildRemoved:unknown_child:" + recipeKey);
}
}
@Override
public void onChildMoved(DataSnapshot dataSnapshot, String previousChildName) {
Log.d(TAG, "onChildMoved:" + dataSnapshot.getKey());
Recipe movedRecipe = dataSnapshot.getValue(Recipe.class);
String recipeKey = dataSnapshot.getKey();
// ...
}
@Override
public void onCancelled(DatabaseError databaseError) {
Log.w(TAG, "postRecipes:onCancelled", databaseError.toException());
Toast.makeText(mContext, "Failed to load recipes.",
Toast.LENGTH_SHORT).show();
}
};
ref.addChildEventListener(childEventListener);
mChildEventListener = childEventListener;
}
@Override
public RecipeViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
View view = inflater.inflate(R.layout.item_recipe, parent, false);
return new RecipeViewHolder(view);
}
@Override
public void onBindViewHolder(RecipeViewHolder holder, int position) {
Recipe recipe = mRecipes.get(position);
holder.nameTextView.setText(recipe.Name);
holder.messageButton.setText("View");
}
@Override
public int getItemCount() {
return mRecipes.size();
}
public void cleanupListener() {
if (mChildEventListener != null) {
mDatabaseReference.removeEventListener(mChildEventListener);
}
}
}
}
各行には、データソースに関連するユニークな値が必要です –