在Android中,从Recycler Adapter正确调用Activity方法的方法是什么?

3

我需要在recycler的适配器的onBindViewHolder中从ViewHolder的一个视图的单击事件调用一个Intent。直接这样做我做不到。

    public void onBindViewHolder(MyAdapter.MyViewHolder viewHolder, int i) {
        viewHolder.button.setonClickListener(new View.onClickListener(
               @Override
               onClick(View v) {
               Intent i=new Intent();
                i.setAction("Intent.ACTION_CALL");
                i.setData(Uri.parse("tel:1234567890"));
                startActivity(i);
            }
        ));
}

这个方法没有生效,一直报错。于是我在Activity中创建了一个公共方法,使用相同的代码。在Adapter构造函数中传入Activity上下文,然后从按钮点击事件中调用了该方法。

((MyActivity)context).makePhoneCall("1234567890");

这个方法可以解决问题,但我觉得应该有更好的方法。 由于我主要是来自C背景,所以不确定。 因此我的问题是,是否有更好或更适合Java编程规范的方法。

基本上,startActivity() 方法来自 Activity 类。因此,我们需要像这样处理。 - Nigam Patro
@NigamPatro startActivity() 方法来自于 Context 类。 - Vladimir Petrakovich
@fRoStBiT,是的伙计,抱歉,它来自Context类,你是对的。 - Nigam Patro
请发布您的活动。只需告诉我您想要解决方案的确切代码或者您想了解启动活动的最佳方法的信息。 - Ajinkya
@Ajinkya,我想知道从Recycler Adapter访问Activity中定义的方法的最佳方式是什么。 - Deepak
3个回答

1
如果您需要通过Intent调用另一个Activity,则可以使用任何视图的Context:
v.getContext().startActivity(i);

我认为这是一种正确的方法。


1
另一种方法是在RecyclerAdapter中实现一个监听器,并在Activity中进行监听。因此,在适配器中:
public class RecyclerAdapter .... {    

    private MyClickListener listener;


    public void onBindViewHolder(MyAdapter.MyViewHolder viewHolder, int i) {
        viewHolder.button.setonClickListener(new View.onClickListener(
               @Override
               onClick(View v) {
                  listener.onClicked(true);
            }
        ));

    public void setMyClickListener(MyClickListener listener) {
        this.listener = listener;
    }

}

//创建MyClickListener类

public interface MyClickListener {

               public void onClicked(boolean status);
        }

在你的活动中:
public class MainActivity ... implements MyClickListener {

@Override
protected void onCreate(Bundle savedInstanceState) {


adapter.setMyClickListener(this);

}

@Override
onClick(boolean status) {
      if (status){
            Intent i=new Intent();
            i.setAction("Intent.ACTION_CALL");
            i.setData(Uri.parse("tel:1234567890"));
            startActivity(i);
      };
}

}

0

尝试这个 在你的适配器中:

 Activity mContext;

public FollowersAdapter(Activity mContext) {
    this.mContext = mContext;
}

//然后在onBindViewHolder中进行点击

  holder.linear_user.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            System.out.println("linear click>>>>>>>>>>>>");

            Intent ToImage = new Intent(mContext, UserData.class);
            ToImage.putExtra("user_id", data.get(position).getFollower_id());
            mContext.startActivity(ToImage);

        }
    });

这是我目前正在使用的方法。我想知道这是否是正确的方式,或者是否有更合适的实现方式。 - Deepak
我正在使用这种方式调用我的活动,对我来说它很好用。如果你发现其他更好的方法,请告诉我。 - Rakshit Nawani

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接