Как: внедрить Onclick Listener для просмотра информации о вызовах из MySQL в утилите с помощью retroFit - PullRequest
0 голосов
/ 24 мая 2019

У меня есть настройка-просмотрщика, которая извлекает информацию с сервера MYSQL через RetroFit.Последний этап заключается в реализации прослушивателя по щелчку, поэтому, когда пользователь нажимает на карту просмотра переработчика, он выводит их на страницу со всей информацией.

Я следую учебному пособию CodingwithMitch https://www.youtube.com/watch?v=69C1ljfDvl0&list=PLceqSj9t5VtrkGKncLPaskYDTK5XkNN13&index=24&t=0s

Я прошел весь путь до конца, когда мне нужно было обновить адаптер, и я застрял с ошибкой, утверждающей, что параметры конструктора не совпадают.Для получения дополнительной информации см. Код на странице «Адаптер» и «Фрагмент».

Страница ADAPTER:

public class WorkoutLogAdapter extends    RecyclerView.Adapter<WorkoutLogAdapter.WorkoutLogViewHolder>{

private Context mContext;
private List<WorkoutLogList> mWorkoutLogList;
private OnLogListener mOnLogListener;

public WorkoutLogAdapter(Context context, List<WorkoutLogList>  mWorkoutLogList, OnLogListener onLogListener){
    this.mContext = context;
    this.mWorkoutLogList = mWorkoutLogList;
    this.mOnLogListener = onLogListener;
}

/**
 * Method which contains the display i.e Cards!
 * @param parent
 * @param viewType
 * @return
 */
@NonNull
@Override
public WorkoutLogViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
    View v = LayoutInflater.from(mContext).inflate(R.layout.recyclerview_workoutlog, parent, false);
    return new WorkoutLogViewHolder(v, mOnLogListener);
}

/**
 * Method which controls the position of the item arraylist in the viewholder.
 * @param holder
 * @param position
 */
@Override
public void onBindViewHolder(@NonNull WorkoutLogViewHolder holder, int position) {
    WorkoutLogList workoutLogList = mWorkoutLogList.get(position);

    holder.mTitle.setText(workoutLogList.getAlternativeThought());

}

/**
 * Method which makes our recycler list the same size as our arraylist of items.
 * @return
 */
@Override
public int getItemCount() {
    return mWorkoutLogList.size();
}

public class WorkoutLogViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{


    public TextView mTitle;
    OnLogListener onLogListener;


    public WorkoutLogViewHolder(@NonNull View itemView, OnLogListener onLogListener) {
        super(itemView);
        mTitle = itemView.findViewById(R.id.titleWorkoutLog);
        this.onLogListener = onLogListener;

        itemView.setOnClickListener(this);
    }

    @Override
    public void onClick(View v) {

        onLogListener.onLogClick(getAdapterPosition());
    }
}

/**
 *
 */
public interface OnLogListener{
    void onLogClick(int position);
}

Страница FRAGMENT:

public class WorkoutLogFragment extends Fragment implements   WorkoutLogAdapter.OnLogListener {

private SharedPreferences loginPref;
private RecyclerView mRecyclerView;
private WorkoutLogAdapter mWorkoutLogAdapter;
private List<WorkoutLogList> mWorkoutLogList;

@Nullable
@Override
public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
    return inflater.inflate(R.layout.fragment_workout_log, container, false);
}

@Override
public void onViewCreated(@NonNull final View view, @Nullable Bundle savedInstanceState) {
    super.onViewCreated(view, savedInstanceState);
    loginPref = getContext().getSharedPreferences("loginPref", Context.MODE_PRIVATE);
    final int userId = loginPref.getInt("userId", 0);


    mRecyclerView = view.findViewById(R.id.mRecyclerView);
    mRecyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));


    Call<List<WorkoutLogList>> call = RetrofitClient.getInstance().getApi()
            .getLogs(userId);
    call.enqueue(new Callback<List<WorkoutLogList>>() {
        @Override
        public void onResponse(Call<List<WorkoutLogList>> call, Response<List<WorkoutLogList>>response) {


            mWorkoutLogList = response.body();
            mWorkoutLogAdapter = new WorkoutLogAdapter(getActivity(), mWorkoutLogList, this);
            mRecyclerView.setAdapter(mWorkoutLogAdapter);

        }

        @Override
        public void onFailure(Call<List<WorkoutLogList>> call, Throwable t) {

        }

    });

}

@Override
public void onLogClick(int position) {
    mWorkoutLogList.get(position);

    Fragment workoutLogFragment = new HomeFragment();
    FragmentTransaction workoutLogTransaction = getActivity().getSupportFragmentManager().beginTransaction();
    workoutLogTransaction.replace(R.id.fragment_container, workoutLogFragment);
    workoutLogTransaction.commit();
}

}

Эта строка из класса Fragment выбрасывает красную строку mWorkoutLogAdapter = new WorkoutLogAdapter (getActivity (), mWorkoutLogList, this);Он не должен принимать параметр "this" в конце.Я последовал за Митчем, обращенным к письму.Это работает у него, однако он использует MYSQL lite в видео, где я использую Retrofit Call.Так что я уверен, что мне нужно каким-то образом изменить конструктор, но я не знаю как.Может кто-нибудь, пожалуйста, помогите мне изменить код, чтобы он работал.

...