如何解决另一个适配器内的Android Recycler View适配器OnClickListener
我有以下适配器:
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 - 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);
}
}
在onBindViewHolder
方法中,我在此适配器内调用另一个适配器,该适配器遵循相同的OnClickListener结构:
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,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());
}
}
}
}
但是,如果我遇到问题,我的活动就无法监听嵌套适配器内部发生的点击事件:
public class PokemonTeambuilderActivity extends AppCompatActivity implements TeambuilderAdapter.ItemClickListener {
@Override
public void onItemClick(View view,int position) {
}
我不知道如何到达TeambuilderAdapter中的PokemonFavoritesAdapter中发生的事件,我想必须在TeambuilderAdapter中实现PokemonFavoritesAdapter.OnClickListener接口,但我不知道该怎么做。有什么提示吗?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。