Java 从适配器中的活动调用方法

Java 从适配器中的活动调用方法,java,android,list,adapter,retrofit2,Java,Android,List,Adapter,Retrofit2,我正在使用改型在RecyclerView中从服务器加载数据。我已经成功地实施了Get和Post改造方法,但是我在Put和Delete方面遇到了一些问题。由于重新循环视图需要适配器来加载数据,并且我需要获取我正在单击的行的位置,因此我必须在适配器中实现on按键(因为我正在使用和编辑文本) 问题是调用我的拦截器、改装调用和所有调用的方法都在我的活动中。 因此,我决定在适配器内的这个活动中调用该方法来执行单个项的Put和Delete。但是我得到了一份工作 java.lang.ClassCastExce

我正在使用改型在
RecyclerView
中从服务器加载数据。我已经成功地实施了
Get
Post
改造方法,但是我在
Put
Delete
方面遇到了一些问题。由于
重新循环视图
需要
适配器
来加载数据,并且我需要获取我正在单击的行的位置,因此我必须在
适配器
中实现
on按键
(因为我正在使用和编辑文本)

问题是调用我的
拦截器
、改装调用和所有调用的方法都在我的
活动
中。 因此,我决定在适配器内的这个活动中调用该方法来执行单个项的Put和Delete。但是我得到了一份工作

java.lang.ClassCastException表示无法强制转换该方法 连接到适配器

这是onKeyPressed方法,ViewCategoryActivity是我的活动,SendNetworkRequest是我的方法:

holder.nameCategory.setOnKeyListener(new View.OnKeyListener() {
            public boolean onKey(View v, int keyCode, KeyEvent event) {
                // If the event is a key-down event on the "enter" button
                if ((event.getAction() == KeyEvent.ACTION_DOWN) &&
                        (keyCode == KeyEvent.KEYCODE_ENTER)) {

                    System.out.println("Entrou no adapter!!");
                    Category2 category = new Category2();
                    category.setName(holder.nameCategory.getText().toString());
                    ((ViewCategoriesActivity)mContext).SendNetworkRequest(categoryList.get(position).getProjectId(), 2, categoryList.get(position).get_id(), new SendCategory(holder.nameCategory.getText().toString()));

                    //Variable to check if the category inserted is equal to a previous one
                    int bool = 0;
                    //The for goes through the list and tries to find a category with the name equal to the one inserted
                    for (int i = 0; i < categoryList.size(); i++){

                        //if it finds equal names bool = 1
                        if (categoryList.get(i).getName().equals(holder.nameCategory.getText().toString())){
                            bool = 1;
                            Toast.makeText(mContext, mContext.getResources().getString(R.string.category_different_name),
                                    Toast.LENGTH_LONG).show();
                        }
                    }

                    //There's no category with the same name so it' OK so insert a new one
                    if (bool == 0){

                        if(mContext instanceof ViewCategoriesActivity){
                            ((ViewCategoriesActivity)mContext).SendNetworkRequest(categoryList.get(position).getProjectId(), 2, categoryList.get(position).get_id(), new SendCategory(holder.nameCategory.getText().toString()));
                        }
                        //categoryList.add(category);

                    } else {

                    }


                    // hide virtual keyboard
                    InputMethodManager imm =
                            (InputMethodManager)mContext.getSystemService(Context.INPUT_METHOD_SERVICE);
                    imm.hideSoftInputFromWindow(holder.nameCategory.getWindowToken(), 0);
                    return true;
                }
                return false;
            }
        });
holder.namecegory.setOnKeyListener(新视图.OnKeyListener(){
公共布尔onKey(视图v、int keyCode、KeyEvent事件){
//如果事件是“回车”按钮上的按键按下事件
if((event.getAction()==KeyEvent.ACTION\u向下)&&
(keyCode==KeyEvent.keyCode\u ENTER)){
System.out.println(“Entrou无适配器!!”;
Category2 category=新的Category2();
category.setName(holder.nameCategory.getText().toString());
发送网络请求(categoryList.get(position).getProjectId(),2,categoryList.get(position).get_id(),新发送类别(holder.nameCategory.getText().toString());
//变量,以检查插入的类别是否等于上一个类别
int bool=0;
//for遍历列表,并尝试查找名称与插入名称相同的类别
对于(int i=0;i
您应该将侦听器从活动传递到适配器。然后,您应该使用该侦听器调用活动中的函数。i、 e,如果您按如下方式调用适配器

adapter = new DataAdapter(data);
其中数据可以是arraylist(假设),然后像这样传递上下文

adapter = new DataAdapter(data,ViewCategoriesActivity.this);

使用适配器中的构造函数接受此侦听器,然后像listener一样调用活动函数。yourFunction()

使用侦听器可以轻松地完成此操作,请尽量不要让代码变得那么复杂。据我所知,你的问题有很好的答案,希望能解决。

不要这样做。使用回调代替哪个方法不能强制转换?发布你的callstack如何使用回调?您能给我解释一下吗?SendNetworkRequest是我无法强制转换的方法。我不明白您的答案,您能给我解释一下吗?在您的活动中:adapter=new DataAdapter(data,ViewCategoriesActivity.this);在适配器类中:public DataAdapter(String data,Activity Activity){},然后在需要时调用Activity.SendNetworkRequest()我这样调用我的适配器:adapter=new CategoryAdapter(getApplicationContext(),listcegories);它的工作原理是这样调用它:adapter=newcategoryadapter(ViewCategoriesActivity.this,listcegories);你能给我解释一下区别吗?