草庐IT

java - Activity 无法转换为接口(interface) (ClassCastException)

coder 2023-12-02 原文

我目前在我的 Android 应用程序中遇到 ClassCastException,原因是“无法将 Activity 转换为界面”。 这是我的代码:

Logcat 表示在 MovieGridFragment 的 onAttach 部分中的“this.clickListener = (clickInterfaceHelper) context;”行中抛出了异常。

我的界面:

public interface clickInterfaceHelper {
void clickOnItem(int id);
void favoriteMovieItem(int movieId); }

fragment 类:

public class MovieGridFragment extends Fragment {

public clickInterfaceHelper clickListener;
private int index;
private GridView movieGridView;
public List<movieData> movieDataList = new ArrayList<>();

public MovieGridFragment() {} //empty constructor

@Override
public void onAttach(Context context) {
    this.clickListener = (clickInterfaceHelper) context;
    super.onAttach(context);
}

@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
    if(savedInstanceState != null) {
        if (!movieDataList.isEmpty()) {
            movieDataList = Arrays.asList((movieData[]) savedInstanceState.getSerializable("OLDMOVIEDATA"));
        }
    }
    super.onCreate(savedInstanceState);
}

主要 Activity :

@Nullable
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
    setHasOptionsMenu(true);


    View rootView = inflater.inflate(R.layout.movie_display_fragment, container, false);

    movieGridView = (GridView) rootView.findViewById(R.id.gv_movie_display);
    movieAdapter adapter = new movieAdapter(getActivity(),movieDataList);
    adapter.notifyDataSetChanged();
    movieGridView.setAdapter(adapter);
    movieGridView.setSelection(index);
    movieGridView.setOnItemClickListener(new AdapterView.OnItemClickListener() {

        @Override
        public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
            if(clickListener != null)
                    clickListener.clickOnItem(position);

        }
    });
    return rootView;
}

@Override
public void onSaveInstanceState(Bundle outState) {
    index = movieGridView.getFirstVisiblePosition();
    outState.putSerializable("OLDMOVIEDATA",movieData.movieDataArray);
    super.onSaveInstanceState(outState);
}}
and mainactivity:

public class MainActivity extends AppCompatActivity implements clickInterfaceHelper {

public static String sorterString = null;
public static String urlBase = "https://api.themoviedb.org/3/movie/";
public static String urlFinal = null;

RequestQueue requestQueue;


@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState == null) {
                getSupportFragmentManager().beginTransaction()
                .add(R.id.activity_container, new MovieGridFragment())
                .commit();
        movieData.movieDataPosition = 0;
    }
    if(savedInstanceState != null) {
        sorterString = savedInstanceState.getString("SORTER");
    }

    if(savedInstanceState == null)
        movieData.movieDataPosition = 0;

    if(sorterString==null)
        sorterString="popular?";
    if(sorterString!="favorite" && sorterString!=null) {
        if(networkChecker.isNetworkAvailableChecker(this)) {
            movieRequest();
        }
    }



}

@Override
public boolean onCreateOptionsMenu(Menu menu) {
    getMenuInflater().inflate(R.menu.main_menu_act, menu);
    return true;
}

@Override
public boolean onOptionsItemSelected(MenuItem item) {
    int id = item.getItemId();

    if(id == R.id.m_popularity_action) {
        if(sorterString != "popular?") {
            sorterString = "popular?";
            if(networkChecker.isNetworkAvailableChecker(this))
            movieRequest();
        }
        return true;
    }

    if(id == R.id.m_action_voter) {
        if(sorterString != "top_rated?") {
            sorterString = "top_rated?";
            if(networkChecker.isNetworkAvailableChecker(this))
            movieRequest();
        }
        return true;
    }

    if(id == R.id.m_favorite_btn) {
        if(sorterString != "favorite") {
            SQLiteOpenHelper helper = new movieDataDbHelper(this);
            SQLiteDatabase database = helper.getReadableDatabase();
            Cursor cursor= database.query(movieDataContract.contractEntry.TABLE_NAME,
                    new String[] {
                            movieDataContract.contractEntry.ID,
                            movieDataContract.contractEntry.IMG_PATH},null,null,null,null,null);
            if(cursor.getCount() == 0) {
                Toast.makeText(this, "there are no favorite movies yet!",Toast.LENGTH_SHORT).show();
            } else {
                sorterString = "favorite";
                showFavoriteFragment();
            }
            database.close();
            helper.close();
            cursor.close();
        }
        return true;
    }
    return super.onOptionsItemSelected(item);
}

public void showFavoriteFragment() {
    favoriteMoviesDetailsFragment fragment = new favoriteMoviesDetailsFragment();
    try {
        getFragmentManager().beginTransaction().replace(R.id.activity_container,fragment).commit();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
    outState.putString("SORTER", sorterString);
    outState.putInt("POSITION",movieData.movieDataPosition);
    super.onSaveInstanceState(outState, outPersistentState);
}

public void movieRequest() {
        urlFinal = urlBase + sorterString + movieData.apiKey;
        urlFinal.trim();
        requestQueue = Volley.newRequestQueue(this);
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, urlFinal, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONArray array = response.getJSONArray("results");
                    movieData.movieDataArray = new movieData[array.length()];

                    for (int i = 0; i < array.length(); i++) {
                        movieData movie = new movieData();
                        JSONObject jsonObject = array.getJSONObject(i);
                        //movie.setPosition(i);
                        movie.setMovieId(jsonObject.getString("id"));
                        movie.setMovieImagePath(jsonObject.getString("poster_path"));
                        movie.setMovieTitle(jsonObject.getString("original_title"));
                        movie.setMoviePlot(jsonObject.getString("overview"));
                        movie.setMovieVoting(jsonObject.getString("vote_average"));
                        movie.setMovieReleaseDate(jsonObject.getString("release_date"));
                        movieData.movieDataArray[i] = movie;
                    }

                    MovieGridFragment gridFragment = new MovieGridFragment();
                    gridFragment.movieDataList = Arrays.asList(movieData.movieDataArray); //hier wird datalist eigentlich zugewiesen
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.activity_container, gridFragment);
                    try {
                        transaction.commitAllowingStateLoss();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("volley", String.valueOf(error));
            }
        }
        );
        requestQueue.add(jsonObjectRequest);

}

@Override
public void clickOnItem(int id) {
    movieData.movieDataPosition = id;
    if(movieData.movieDataArray == null) {
        movieRequest();
    } else {
        Intent intent = new Intent(this, detailsActivity.class);
        intent.putExtra("FRAGMENT","MOVIE");
        startActivity(intent);
    }

}

@Override
public void favoriteMovieItem(int movieId) {
    movieData.dbPosition = movieId;

    Intent intent = new Intent(this,detailsActivity.class);
    intent.putExtra("FRAGMENT","favorite");
    startActivity(intent);
} }

最佳答案

你可以试试这个

this.clickListener = (MainActivity) getActivity();

您获取 FragmentActivity 并将其转换到您的 MainActivity 中

编辑:

我建议您在 fragment 中添加一个函数,例如:

public void setListener(clickInterfaceHelper listener) {
     this.clickListener = listener;
}

在你的 Activity 中:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(savedInstanceState == null) {
    MovieGridFragment fragment = new MovieGridFragment();
    fragment.setListener(this);   // some change here
                getSupportFragmentManager().beginTransaction()
                .add(R.id.activity_container, fragment)
                .commit();
        movieData.movieDataPosition = 0;
    }
    if(savedInstanceState != null) {
        sorterString = savedInstanceState.getString("SORTER");
    }

    if(savedInstanceState == null)
        movieData.movieDataPosition = 0;

    if(sorterString==null)
        sorterString="popular?";
    if(sorterString!="favorite" && sorterString!=null) {
        if(networkChecker.isNetworkAvailableChecker(this)) {
            movieRequest();
        }
    }

}

.... no relevant functions 


public void movieRequest() {
        urlFinal = urlBase + sorterString + movieData.apiKey;
        urlFinal.trim();
        requestQueue = Volley.newRequestQueue(this);
        JsonObjectRequest jsonObjectRequest = new JsonObjectRequest(Request.Method.GET, urlFinal, null, new Response.Listener<JSONObject>() {
            @Override
            public void onResponse(JSONObject response) {
                try {
                    JSONArray array = response.getJSONArray("results");
                    movieData.movieDataArray = new movieData[array.length()];

                    for (int i = 0; i < array.length(); i++) {
                        movieData movie = new movieData();
                        JSONObject jsonObject = array.getJSONObject(i);
                        //movie.setPosition(i);
                        movie.setMovieId(jsonObject.getString("id"));
                        movie.setMovieImagePath(jsonObject.getString("poster_path"));
                        movie.setMovieTitle(jsonObject.getString("original_title"));
                        movie.setMoviePlot(jsonObject.getString("overview"));
                        movie.setMovieVoting(jsonObject.getString("vote_average"));
                        movie.setMovieReleaseDate(jsonObject.getString("release_date"));
                        movieData.movieDataArray[i] = movie;
                    }

                    MovieGridFragment gridFragment = new MovieGridFragment();
                    gridfragment.setListener(this);  // some change here
                    gridFragment.movieDataList = Arrays.asList(movieData.movieDataArray); //hier wird datalist eigentlich zugewiesen
                    FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
                    transaction.replace(R.id.activity_container, gridFragment);
                    try {
                        transaction.commitAllowingStateLoss();
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } catch (JSONException e) {
                    e.printStackTrace();
                }
            }
        }, new Response.ErrorListener() {
            @Override
            public void onErrorResponse(VolleyError error) {
                Log.e("volley", String.valueOf(error));
            }
        }
        );
        requestQueue.add(jsonObjectRequest);

}

希望这对您有所帮助。

关于java - Activity 无法转换为接口(interface) (ClassCastException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42678465/

有关java - Activity 无法转换为接口(interface) (ClassCastException)的更多相关文章

  1. ruby-on-rails - 在 Rails 中将文件大小字符串转换为等效千字节 - 2

    我的目标是转换表单输入,例如“100兆字节”或“1GB”,并将其转换为我可以存储在数据库中的文件大小(以千字节为单位)。目前,我有这个:defquota_convert@regex=/([0-9]+)(.*)s/@sizes=%w{kilobytemegabytegigabyte}m=self.quota.match(@regex)if@sizes.include?m[2]eval("self.quota=#{m[1]}.#{m[2]}")endend这有效,但前提是输入是倍数(“gigabytes”,而不是“gigabyte”)并且由于使用了eval看起来疯狂不安全。所以,功能正常,

  2. ruby-on-rails - 由于 "wkhtmltopdf",PDFKIT 显然无法正常工作 - 2

    我在从html页面生成PDF时遇到问题。我正在使用PDFkit。在安装它的过程中,我注意到我需要wkhtmltopdf。所以我也安装了它。我做了PDFkit的文档所说的一切......现在我在尝试加载PDF时遇到了这个错误。这里是错误:commandfailed:"/usr/local/bin/wkhtmltopdf""--margin-right""0.75in""--page-size""Letter""--margin-top""0.75in""--margin-bottom""0.75in""--encoding""UTF-8""--margin-left""0.75in""-

  3. ruby - 使用 ruby​​ 将 HTML 转换为纯文本并维护结构/格式 - 2

    我想将html转换为纯文本。不过,我不想只删除标签,我想智能地保留尽可能多的格式。为插入换行符标签,检测段落并格式化它们等。输入非常简单,通常是格式良好的html(不是整个文档,只是一堆内容,通常没有anchor或图像)。我可以将几个正则表达式放在一起,让我达到80%,但我认为可能有一些现有的解决方案更智能。 最佳答案 首先,不要尝试为此使用正则表达式。很有可能你会想出一个脆弱/脆弱的解决方案,它会随着HTML的变化而崩溃,或者很难管理和维护。您可以使用Nokogiri快速解析HTML并提取文本:require'nokogiri'h

  4. ruby - 将数组的内容转换为 int - 2

    我需要读入一个包含数字列表的文件。此代码读取文件并将其放入二维数组中。现在我需要获取数组中所有数字的平均值,但我需要将数组的内容更改为int。有什么想法可以将to_i方法放在哪里吗?ClassTerraindefinitializefile_name@input=IO.readlines(file_name)#readinfile@size=@input[0].to_i@land=[@size]x=1whilex 最佳答案 只需将数组映射为整数:@land边注如果你想得到一条线的平均值,你可以这样做:values=@input[x]

  5. ruby - 将散列转换为嵌套散列 - 2

    这道题是thisquestion的逆题.给定一个散列,每个键都有一个数组,例如{[:a,:b,:c]=>1,[:a,:b,:d]=>2,[:a,:e]=>3,[:f]=>4,}将其转换为嵌套哈希的最佳方法是什么{:a=>{:b=>{:c=>1,:d=>2},:e=>3,},:f=>4,} 最佳答案 这是一个迭代的解决方案,递归的解决方案留给读者作为练习:defconvert(h={})ret={}h.eachdo|k,v|node=retk[0..-2].each{|x|node[x]||={};node=node[x]}node[

  6. ruby-on-rails - 无法使用 Rails 3.2 创建插件? - 2

    我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby​​1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在

  7. ruby - 无法运行 Rails 2.x 应用程序 - 2

    我尝试运行2.x应用程序。我使用rvm并为此应用程序设置其他版本的ruby​​:$rvmuseree-1.8.7-head我尝试运行服务器,然后出现很多错误:$script/serverNOTE:Gem.source_indexisdeprecated,useSpecification.Itwillberemovedonorafter2011-11-01.Gem.source_indexcalledfrom/Users/serg/rails_projects_terminal/work_proj/spohelp/config/../vendor/rails/railties/lib/r

  8. ruby-on-rails - 无法在centos上安装therubyracer(V8和GCC出错) - 2

    我正在尝试在我的centos服务器上安装therubyracer,但遇到了麻烦。$geminstalltherubyracerBuildingnativeextensions.Thiscouldtakeawhile...ERROR:Errorinstallingtherubyracer:ERROR:Failedtobuildgemnativeextension./usr/local/rvm/rubies/ruby-1.9.3-p125/bin/rubyextconf.rbcheckingformain()in-lpthread...yescheckingforv8.h...no***e

  9. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  10. java - 等价于 Java 中的 Ruby Hash - 2

    我真的很习惯使用Ruby编写以下代码:my_hash={}my_hash['test']=1Java中对应的数据结构是什么? 最佳答案 HashMapmap=newHashMap();map.put("test",1);我假设? 关于java-等价于Java中的RubyHash,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/22737685/

随机推荐