从适配器中的Activity调用方法

时间:2017-09-01 14:39:34

标签: java android list adapter retrofit2

我正在使用Retrofit从我的服务器加载RecyclerView中的数据。我已成功实施GetPost改造方法,但我遇到了PutDelete方面的一些问题。由于ReclyclerView需要Adapter来加载数据,并且我需要获取我要点击的行的位置,因此我必须实现onKeyPressed(因为我正在使用和EditText )在我的Adapter内。

问题在于调用我的Interceptor,Retrofit调用和Everything的方法在我的Activity中。 所以我决定在我的适配器中调用此Activity中的方法来执行单个项目的Put和Delete。但是我得到了一个

  

java.lang.ClassCastException表示该方法无法进行转换   到适配器。

这是onKeyPressed方法,ViewCategoryActivity我的Activity和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;
            }
        });

2 个答案:

答案 0 :(得分:1)

您应该将侦听器从您的活动传递给适配器。然后,您应该使用该侦听器来调用您的活动中的函数。即,如果您按以下方式调用适配器,

adapter = new DataAdapter(data);

其中数据可以是一个arraylist(假设),然后像这样传递上下文

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

使用适配器中的构造函数接受此侦听器,然后调用您的activity函数,如listener.yourFunction()

答案 1 :(得分:0)

您可以轻松地使用侦听器,尽量不要让您的代码变得复杂。据我所知,你的问题有很好的答案here,希望它能奏效。