如何在RecyclerView适配器中启动startActivityForResult并覆盖onActivityResult?

时间:2019-11-28 11:55:23

标签: android kotlin android-recyclerview

startActivity中的recyclerView adapter可以正常工作,但是当我尝试在startActivityForResult中的recyclerView adapter并覆盖onActivityResult(在mainActivity中)时,则无法正常工作。

2 个答案:

答案 0 :(得分:0)

在kotlin中,您可以尝试在类Adapter内将函数作为参数传递给适配器:

class MyAdapter(val context: Context, 
                val list: List<Any?>,
                val onClickFunction: ((Any?) -> Unit)? = null) {
    // previous class's properties and functions ..

    fun override onBindViewHolder(holder: MyHolder, position: Int) {
        // previous code ..
        holder.whatEverYouWantClick.setOnClickListener {
           this@MyAdapter.onClickFunction?.invoke(list.get(position));
        }
    }
}

,然后在“ setRecyclerView”函数中输入以下内容:

mRecyclerView.adapter = MyAdapter(context, listOfWhatEverIWant) {
    // the on click will run here

    // storage the results ..

    this.finish()
}

如果您不了解我在做什么,则向一个传递给适配器的函数传递信息,该函数在单击一个特定的position元素时运行,此函数设置结果并完成以返回调用者活动的结果。

答案 1 :(得分:0)

您做错了,不是您的适配器来处理单击操作。我建议您创建一个接口来创建侦听器:

public interface AdapterItemClickListener<T>
{
    void onItemClicked(final T item);
}

然后,在适配器构造函数中,您将具有以下内容:

private final AdapterItemClickListener<Object> _listener;
ListAdapter(final AdapterItemClickListener<Object> listener)
{
    _listener = listener;
}

所以当您绑定时(我没有代码,所以我想您正在使用RecyclerView.Adapter)

 @Override
    public void onBindViewHolder(final ViewHolder holder, final int position)
    {
        holder.itemView.setOnClickListener(v -> _listener.onItemClicked(getItem(position)));
    }

您的活动将需要实现该接口,然后您必须像这样在不活动状态下创建适配器:

_adapter = ListAdapter(this);

结束添加此方法

  private void onItemClicked(final Object item)
    {
       startActivityForResult(Intent);
    }