0

I have the following Adapter :

public class TeambuilderAdapter extends RecyclerView.Adapter<TeambuilderAdapter.ViewHolder> implements ItemTouchHelperAdapter {

private List<PokemonTeam> mData;

private LayoutInflater mInflater;
private ItemClickListener mClickListener;
private Context mContext;
private PokemonFavoritesAdapter pokemonFavoritesAdapter;
private GridLayoutManager gridLayoutManager;

// data is passed into the constructor
public TeambuilderAdapter(Context context, List<PokemonTeam> data) {
    this.mInflater = LayoutInflater.from(context);
    this.mData = data;
    mContext = context;
    setHasStableIds(true);
}

@Override
public long getItemId(int position) {
    PokemonTeam pokemonTeam = mData.get(position);
    return (pokemonTeam.getName()).hashCode();
}

// inflates the row layout from xml when needed
@Override
public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.list_item_teambuilder, parent, false);
    return new ViewHolder(view);
}

// binds the data to the TextView in each row
@Override
public void onBindViewHolder(ViewHolder holder, int position) {
    PokemonTeam pokemonTeam = mData.get(position);

    gridLayoutManager = new GridLayoutManager(mContext, 6);
    pokemonFavoritesAdapter = new PokemonFavoritesAdapter(mContext, pokemonTeam.getPokemonList());
    holder.teamSpritesRecyclerView.setAdapter(pokemonFavoritesAdapter);
    holder.teamSpritesRecyclerView.setLayoutManager(gridLayoutManager);

    String pokemonTeamName = pokemonTeam.getName();
    if (pokemonTeamName != null && !pokemonTeamName.isEmpty()) {
        holder.teamTitleTextView.setText(pokemonTeam.getName());
    }

}

// total number of rows
@Override
public int getItemCount() {
    int size = 0;
    if (Objects.nonNull(mData)) {
        size = mData.size();
    }
    return size;
}

@Override
public void onItemMove(int fromPosition, int toPosition) {
    if (fromPosition < toPosition) {
        for (int i = fromPosition; i < toPosition; i++) {
            Collections.swap(mData, i, i + 1);
        }
    } else {
        for (int i = fromPosition; i > toPosition; i--) {
            Collections.swap(mData, i, i - 1);
        }
    }
    notifyItemMoved(fromPosition, toPosition);
    ((PokemonTeambuilderActivity) mContext).refreshTeamList();
}

@Override
public void onItemDismiss(int position) {
    mData.remove(position);
    notifyItemRemoved(position);
    ((PokemonTeambuilderActivity) mContext).refreshTeamList();
}

// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {
    TextView teamTitleTextView;
    RecyclerView teamSpritesRecyclerView;
    CardView pokemonTeambuilderContainer;

    ViewHolder(View itemView) {
        super(itemView);
        teamTitleTextView = itemView.findViewById(R.id.pokemonTeambuilderTitleTextView);
        teamSpritesRecyclerView = itemView.findViewById(R.id.pokemonTeambuilderSpritesLayout);
        pokemonTeambuilderContainer = itemView.findViewById(R.id.pokemonTeambuilderContainer);
        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (mClickListener != null) {
            mClickListener.onItemClick(view, getAdapterPosition());
        }
    }
}

// convenience method for getting data at click position
public PokemonTeam getItem(int id) {
    return mData.get(id);
}


// allows clicks events to be caught
public void setClickListener(ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);
}
}

In onBindViewHolder method I call another adapter inside this adapter which follows the same OnClickListener structure :

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

private Context mContext;
private List<Pokemon> favoritePokemon;
private LayoutInflater mInflater;
private PokemonFavoritesAdapter.ItemClickListener mClickListener;

public PokemonFavoritesAdapter(Context context, List<Pokemon> list) {
    this.mInflater = LayoutInflater.from(context);
    mContext = context;
    favoritePokemon = list;
}

@NonNull
@Override
public PokemonFavoritesAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View view = mInflater.inflate(R.layout.list_item_pokemon_favorite, parent, false);
    return new PokemonFavoritesAdapter.ViewHolder(view);
}

@Override
public void onBindViewHolder(@NonNull PokemonFavoritesAdapter.ViewHolder holder, int position) {
    Pokemon pokemon = favoritePokemon.get(position);
    String pokemonId = pokemon.get_id();
    int dominantColor = PokemonUtils.getDominantColorFromPokemon(pokemonId, mContext);
    int lighterDominantColor = PokemonUtils.lighterColor(dominantColor, GenericConstants.DARK_FACTOR);
    int pokemonImageId = PokemonUtils.getPokemonSugimoriImageById(pokemonId, mContext);
    holder.circularImageView.setBorderColor(dominantColor);
    holder.circularImageView.setBorderWidth(4);
    holder.circularImageView.setCircleColor(lighterDominantColor);
    holder.circularImageView.setShadowRadius(6);
    Picasso.get().load(pokemonImageId).fit().into(holder.circularImageView);
}

@Override
public long getItemId(int position) {
    return position;
}

@Override
public int getItemCount() {
    int size = 0;
    if (Objects.nonNull(favoritePokemon) && !favoritePokemon.isEmpty()) {
        size = favoritePokemon.size();
    }
    return size;
}

// convenience method for getting data at click position
public Pokemon getItem(int id) {
    return favoritePokemon.get(id);
}

// allows clicks events to be caught
public void setClickListener(PokemonFavoritesAdapter.ItemClickListener itemClickListener) {
    this.mClickListener = itemClickListener;
}

// parent activity will implement this method to respond to click events
public interface ItemClickListener {
    void onItemClick(View view, int position);
}

// stores and recycles views as they are scrolled off screen
public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener {


    CircularImageView circularImageView;


    ViewHolder(View view) {
        super(view);
        circularImageView = view.findViewById(R.id.civ_pokemon_favorite);
        view.setOnClickListener(this);
    }

    @Override
    public void onClick(View view) {
        if (mClickListener != null) {
            mClickListener.onItemClick(view, getAdapterPosition());
        }
    }
}

}

However I have a problem , my activity can't listen the click events that happens inside my nested adapter :

public class PokemonTeambuilderActivity extends AppCompatActivity implements TeambuilderAdapter.ItemClickListener {
    @Override
public void onItemClick(View view, int position) {
   
}

I don't know how to reach the events that happens within my PokemonFavoritesAdapter in my TeambuilderAdapter , I supose that I must implement the PokemonFavoritesAdapter.OnClickListener interface in my TeambuilderAdapter but I don't know how to do it . Any hint ?

Nexussim Lements
  • 535
  • 1
  • 15
  • 47

0 Answers0