【问题标题】:how to call startActivity in RecyclerView Adapter (DataBinding)RecyclerView Adapter(DataBinding)中如何调用startActivity
【发布时间】:2017-08-30 09:27:39
【问题描述】:

我的RecyclerView(rvPredictionIndex) 项目包括ImageViewEditTextButton,当单击Button 时,EditText 中的文本将被上传到服务器上,当单击ImageView 时,新的@987654328 @ 将被调用,该项目的位置将使用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();
    }
}

我已经在 recyclerView 的 ItemClick 上打开了新活动,但是当我尝试单击 EditText 输入内容时,它会将我重定向到新活动,这就是为什么我想在 ImageView click 上开始新活动..

这是我的 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) {

            }
        }));
    }

【问题讨论】:

  • 什么是 rvPredictionIndex
  • rvPrediction 是一个 RecyclerView
  • rvPredictionIndexClick 在适配器之外,如果我没记错的话? .只是想在回答之前确定
  • addOnItemTouchListener 基本上每次触摸recyclerview 项目时都会调用。而不是你必须为 ImageView 做单独的 onItemClickListeners?
  • 调用 rvPredictionIndexClick 时是否要打开活动?

标签: android data-binding android-recyclerview android-databinding


【解决方案1】:

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

                }

【讨论】:

    【解决方案2】:

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

    直截了当:向您的适配器添加回调并在调用视线内执行所有操作(片段等)

    【讨论】:

    • @toNysTark 你这是什么意思?
    • 好的,这篇文章很有帮助,并为我提供了另外 2 个改进代码的想法。谢谢@GeorgySavatkov
    猜你喜欢
    • 2021-08-24
    • 2019-06-29
    • 1970-01-01
    • 2023-03-21
    • 1970-01-01
    • 2021-08-04
    • 2018-06-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多