Android - 使用来自自定义 RecyclerView 适配器的 activity 吸气剂

Android - using activity getters from custom RecyclerView adapter

我有以下 类:

MatchActivity.java:

public void setDart1(int playerIndex, int points) {
        getDart1().set(playerIndex, points);
    }

    public ArrayList<Integer> getDart1() {
        return dart1;
    }

    public void setDart2(int playerIndex, int points) {
        getDart2().set(playerIndex, points);
    }

    public ArrayList<Integer> getDart2() {
        return dart2;
    }

    public void setDart3(int playerIndex, int points) {
        getDart3().set(playerIndex, points);
    }

    public ArrayList<Integer> getDart3() {
        return dart3;
    }

MatchActivityPlayerAdapter.java:

package de.tkirchmann.myaveragev3;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import androidx.annotation.NonNull;
import androidx.constraintlayout.widget.ConstraintLayout;
import androidx.recyclerview.widget.RecyclerView;

import java.io.Serializable;
import java.util.List;

public class MatchActivityPlayerAdapter extends RecyclerView.Adapter<MatchActivityPlayerAdapter.MatchActivityPlayerRowViewHolder> {

    private final List<Player> playerList;
    private final Match match;
    private Context context;

    MatchActivityPlayerAdapter(List<Player> playerList, Match match) {
        this.playerList = playerList;
        this.match = match;
    }

    @NonNull
    @Override
    public MatchActivityPlayerAdapter.MatchActivityPlayerRowViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.match_activity_row_layout, parent, false);
        return new MatchActivityPlayerRowViewHolder(view);
    }

    @Override
    public void onBindViewHolder(@NonNull MatchActivityPlayerAdapter.MatchActivityPlayerRowViewHolder holder, int position) {
        final Player player = playerList.get(position);
        MatchActivity matchActivity = new MatchActivity();

        holder.nameTextView.setText(player.getPlayerName());
        holder.pointsTextView.setText(matchActivity.getRemainingPoints().get(position));
        holder.dart1.setText(matchActivity.getDart1().get(position));
        holder.dart2.setText(matchActivity.getDart2().get(position));
        holder.dart3.setText(matchActivity.getDart3().get(position));
        holder.dartsCombined.setText(matchActivity.getDartsCombined().get(position));
        /*holder.averageTextView.setText(matchActivity.getAverage().get(position));*/
    }

    @Override
    public int getItemCount() {
        return playerList.size();
    }

    class MatchActivityPlayerRowViewHolder extends RecyclerView.ViewHolder {
        public TextView nameTextView, pointsTextView, averageTextView, dart1, dart2, dart3, dartsCombined;

        public MatchActivityPlayerRowViewHolder(View playerRowView) {
            super(playerRowView);
            final ConstraintLayout playerRowRootLayout = playerRowView.findViewById(R.id.match_player_row_root_layout);
            nameTextView = playerRowView.findViewById(R.id.name);
            pointsTextView = playerRowView.findViewById(R.id.points);
            averageTextView = playerRowView.findViewById(R.id.average);
            dart1 = playerRowView.findViewById(R.id.dart1);
            dart2 = playerRowView.findViewById(R.id.dart2);
            dart3 = playerRowView.findViewById(R.id.dart3);
            dartsCombined = playerRowView.findViewById(R.id.last_darts_combined);
        }
    }
}

在自定义适配器的 onBindViewHolder() 方法中,我想通过从我的 activity 获取列表中的值来设置我的视图的文本。但是我得到了一个 IndexOutOfBoundsException,所以我在调用 getters 时可能没有正确的 reference/context。

我怎样才能得到正确的 context/reference 到我的 activity?

你可以试试这个:

((YourActivityName) itemView.getContext()).getDart1();

其他吸气剂依此类推。您可以使用任何 public 方法。