【问题标题】:Call activity method from recyclerview adapter从 recyclerview 适配器调用活动方法
【发布时间】:2018-11-07 17:33:03
【问题描述】:

我试图从我的回收器视图适配器中调用一个活动方法。 我做了什么,
我已经创建了一个接口,在所需的活动上实现覆盖其方法并尝试从适配器调用
我收到 java.lang.ClassCastException: android.app.Application 无法转换为 my.package.Interface.InterfaceName
下面是代码

MethodCaller.java

public interface MethodCaller {
    void deleteAddress(String did);
}

AddressAdapter.java

public class AddressAdapter extends RecyclerView.Adapter<AddressAdapter.ViewHolder> {
    private Context context;
    private List<Address> list;       

    public AddressAdapter(Context context, List<Address> list) {
        this.context = context;
        this.list = list;
    }

    @NonNull
    @Override
    public AddressAdapter.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
        View v = LayoutInflater.from(context).inflate(R.layout.address_single, parent, false);
        return new AddressAdapter.ViewHolder(v);
    }

    @Override
    public void onBindViewHolder(@NonNull AddressAdapter.ViewHolder holder, final int position) {
        Address address = list.get(position);

        holder.btn_deleteAddress.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Address address = list.get(position);
                final String id = address.getId();

                //if(context instanceof MethodCaller){
                    ((MethodCaller)context).deleteAddress(id);  //ClassCastException - Error
                //}
            }
        });
    }

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

    public class ViewHolder extends RecyclerView.ViewHolder {           
        public Button btn_deleteAddress;

        public ViewHolder(View itemView) {
            super(itemView);


            btn_deleteAddress = itemView.findViewById(R.id.btn_deleteAddress);
        }
    }
}

AddressActivity.java

public class AddressActivity extends AppCompatActivity implements MethodCaller {


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_address);

        //CODE
            }

    }

    @Override
    public void deleteAddress(String did) {
        Toast.makeText(this, did, Toast.LENGTH_SHORT).show();

        /*DialogInterface.OnClickListener dialogClickListener = new DialogInterface.OnClickListener() {
                    @Override
                    public void onClick(DialogInterface dialog, int which) {
                        switch (which){
                            case DialogInterface.BUTTON_POSITIVE:
                                deleteAddressRequest(id);
                                break;
                            case DialogInterface.BUTTON_NEGATIVE:
                                //No button clicked
                                break;
                        }
                    }
                };

                AlertDialog.Builder builder = new AlertDialog.Builder(context);
                builder.setMessage("Are you sure you want to delete this item?").setPositiveButton("Yes", dialogClickListener)
                        .setNegativeButton("No", dialogClickListener).show();*/
    }
}

【问题讨论】:

标签: java android interface android-recyclerview


【解决方案1】:

试试这个

public MethodCaller methodCaller;
public AddressAdapter(Context context, List<Address> list,MethodCaller methodCaller) {
    this.context = context;
    this.list = list;
    this.methodCaller = methodCallerl;

}

@Override
public void onBindViewHolder(@NonNull AddressAdapter.ViewHolder holder, final int position) {
    Address address = list.get(position);

    holder.btn_deleteAddress.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            Address address = list.get(position);
            final String id = address.getId();
            methodCaller .deleteAddress(id);
         }
    });
}

AddressActivity.java

像这样在适配器中传递接口;

new AddressAdapter(context,list,this);

【讨论】:

  • 感谢@Hardik Vasani,它对我来说工作得很好!
【解决方案2】:

您可以使用您在适配器中传递的活动上下文从适配器调用活动方法

((YourActivityName)mContext).customMethod();

如果您对多个类使用相同的适配器,那么您可以在执行操作之前添加检查。

if(mContext instanceof YourActivityName){
       ((YourActivityName)mContext).yourActivityMethod();
   }

更多详情请关注https://trinitytuts.com/tips/call-activity-method-inside-adapter/

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-30
    相关资源
    最近更新 更多