как вызвать startActivity в адаптере RecyclerView (DataBinding)

Мой элемент RecyclerView(rvPredictionIndex) включает в себя ImageView, EditText и Button, при нажатии Button текст внутри EditText будет загружен на сервер, а при нажатии ImageView будет вызван новый Activity, и позиция этого элемента будет передана новой активности с использованием Intent().

Я использую DataBinding, поэтому View() здесь не используется (или любой другой способ использования View(), чем я не знаю).

Вот код адаптера RecyclerView....

public class PredictionItemAdapter extends RecyclerView.Adapter<PredictionItemAdapter.MyViewHolder> {
    private List<PredictionItems> mPredictionItemsList;
    private Context mContext;
    private int predictionId;
    private String etAnswer;

    public class MyViewHolder extends RecyclerView.ViewHolder {
        //        ImageView ivPredictionImage;
//        CustomTextView txtPredictionQuestion;
        PredictionItemBinding predictionItemBinding;

        public MyViewHolder(PredictionItemBinding predictionItemBinding) {
            super(predictionItemBinding.getRoot());
            this.predictionItemBinding = predictionItemBinding;
//            ivPredictionImage = (ImageView) itemView.findViewById(R.id.ivPredictionImage);
//            txtPredictionQuestion = (CustomTextView) itemView.findViewById(R.id.txtPredictionQuestion);
        }
    }

    public PredictionItemAdapter(Context context, List<PredictionItems> mPredictionItemsList) {
        this.mPredictionItemsList = mPredictionItemsList;
        this.mContext = context;

    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
//        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.prediction_item, parent, false);
//        return new MyViewHolder(view);
        PredictionItemBinding predictionItemBinding = DataBindingUtil.inflate(LayoutInflater.from(parent.getContext()),
                R.layout.prediction_item, parent, false);
        return new MyViewHolder(predictionItemBinding);
    }

    @Override
    public void onBindViewHolder(final MyViewHolder holder, final int position) {
//        PredictionItems predictionItems = mPredictionItemsList.get(position);
//        Picasso.with(mContext).load(predictionItems.getImage()).into(holder.ivPredictionImage);
//        holder.txtPredictionQuestion.setText(predictionItems.getQuestion());
        final PredictionItems predictionItems = mPredictionItemsList.get(position);

        PredictionViewModel predictionViewModel = new PredictionViewModel(predictionItems);
        predictionViewModel.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
            @Override
            public void onPropertyChanged(Observable sender, int propertyId) {
                if (propertyId == 1) {
                    etAnswer = holder.predictionItemBinding.editText.getText().toString();
                    predictionId = mPredictionItemsList.get(position).getId();
                    if (etAnswer.equals("")) {
                        Utility.showToastShort(mContext, "Please input answer");
                    } else {
                        callUpdatePredictionAnswerApi(predictionId, etAnswer);
//                    Toast.makeText(mContext, "submjit of " + holder.getAdapterPosition), Toast.LENGTH_SHORT).show();
                    }
                }
                else if (propertyId == 2){
                    //Here i want to start activity and pass data with intent
                }
            }
        });
        holder.predictionItemBinding.setPredictionVM(predictionViewModel);
    }

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

Я уже открыл новую активность в ItemClick recyclerView, но когда я попытался щелкнуть EditText для ввода чего-либо, он перенаправит меня к новой активности, поэтому я хочу начать новую активность при щелчке ImageView.

вот мой RecyclerViewItem Click...

private void rvPredictionIndexClick() {
        rvPredictionIndex.addOnItemTouchListener(new RecyclerTouchListener(mContext, rvPredictionIndex, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {
                String preId = mPredictionItemsList.get(position).getId().toString();
                Intent i = new Intent(mContext, PredictionInfoActivity.class);
                String posi = ((String.valueOf(position)));
                i.putExtra("predictionId", posi);
                startActivity(i);
            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));
    }

person Community    schedule 30.08.2017    source источник
comment
Что такое rvPredictionIndex?   -  person Raghavendra    schedule 30.08.2017
comment
rvPrediction — это RecyclerView   -  person    schedule 30.08.2017
comment
rvPredictionIndexClick находится вне адаптера, если я не ошибаюсь? . просто хотел убедиться прежде чем отвечать   -  person Rohit Singh    schedule 30.08.2017
comment
addOnItemTouchListener в основном вызывается каждый раз, когда вы касаетесь элемента recyclerview. Вместо этого вам нужно делать отдельные onItemClickListeners для ImageView?   -  person Raghavendra    schedule 30.08.2017
comment
Вы хотите открыть активность при вызове rvPredictionIndexClick?   -  person Hamza    schedule 30.08.2017


Ответы (2)


Создайте класс DataBindingAdapter и вставьте

  @BindingAdapter("android:onClick")
    public static void setOnClickListener(View view, final Runnable runnable) {
        view.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                runnable.run();
            }
        });
    }

затем перейдите в свой класс ViewModel и вставьте

   public void onSubmitClicked() {
        Log.e("onButtonSubmit", "onButtonSubmit");
        notifyPropertyChanged(1);
    }

    public void onImageClicked() {
        Log.e("onImageClicked", "onImageClicked");
        notifyPropertyChanged(2);
    }

чем перейти к вашему файлу item.xml и позвонить

android:onClick="@{predictionVM::onSubmitClicked}"

в вашей кнопке и

android:onClick="@{predictionVM.onImageClicked}

в вашем imaggView, чем перейти к вашему ItemAdapterClass и внутри onCreateViewHolder

  predictionViewModel.addOnPropertyChangedCallback(new Observable.OnPropertyChangedCallback() {
            @Override
            public void onPropertyChanged(Observable sender, int propertyId) {
                if (propertyId == 1) {
                 //do your stuff
               }
               else if (propertyId == 2) {
                   // do your stuff

                }
person Ravi Vaniya    schedule 22.09.2017

Самым элегантным и откровенно адекватным решением было бы ничего не делать внутри адаптера! Я написал статью об адаптерах, посмотрите адаптеры RecyclerView

Просто: добавьте обратный вызов в свой адаптер и выполните все внутри вызова (фрагмент и т. д.)

person egorikem    schedule 30.08.2017
comment
@toNysTark, что ты имеешь в виду? - person egorikem; 30.08.2017
comment
okk понял, статья полезная и дала мне еще 2 идеи по улучшению моего кода. спасибо @GeorgySavatkov - person ; 30.08.2017