另一个适配器内的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 (将#修改为@)

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...