如何调用startActivity在RecyclerView适配器(数据绑定)

问题描述:

RecyclerView(rvPredictionIndex)项目包括ImageViewEditTextButton,当Button点击里面EditText文本将在服务器上上传并点击ImageView时,新Activity将被调用,该项目的位置将使用Intent()传递给新活动。如何调用startActivity在RecyclerView适配器(数据绑定)

我正在使用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(); 
    } 
} 

我已经打开了新的活动上recyclerView的项目单击但是当我试图点击EditText上输入的东西,它将我重定向到新的活动,所以这就是为什么我要开始的ImageView点击新的活动..

这里是我的RecyclerViewItem点击...

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) { 

      } 
     })); 
    } 
+0

什么是** rvPredictionIndex **? – Raghavendra

+0

rvPrediction是一个RecyclerView –

+0

rvPredictionIndexClick是否在适配器之外如果我没有错? 。只是想在回答之前确定 –

创建类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 

       } 
+1

thx @rayVaniya这正是我想要的, –

最优雅和坦率的解决方案就是不要在适配器内做任何事情! 我写了一篇关于适配器的文章,看看RecyclerView Adapters

简单:添加一个回调到您的适配器和内部调用的视线进行一切(片段等)

+0

@toNysTark你是什么意思? –

+1

okk明白了,文章很有帮助,并给了我2个更多的改进我的代码的想法。 thx @GeorgySavatkov –