Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 使用RecyclerView和异步任务时出现空指针异常_Android_Android Fragments - Fatal编程技术网

Android 使用RecyclerView和异步任务时出现空指针异常

Android 使用RecyclerView和异步任务时出现空指针异常,android,android-fragments,Android,Android Fragments,我正在使用RecyclerView和Async Task更新此RecyclerView中的视图,但我在RecyclerView.setAdapter处收到一个空指针异常。MyFetchMoviePoster类包含异步任务,PhotoAlbumAdapter包含回收器视图的适配器。 谁能帮我一下吗 new MainActivityFragment().update_the_Adaptor(resultStrs); MainActivityFragment public class MainAct

我正在使用
RecyclerView
Async Task
更新此RecyclerView中的视图,但我在
RecyclerView.setAdapter
处收到一个空指针异常。My
FetchMoviePoster
类包含异步任务,
PhotoAlbumAdapter
包含回收器视图的适配器。 谁能帮我一下吗

new MainActivityFragment().update_the_Adaptor(resultStrs);
MainActivityFragment

public class MainActivityFragment extends Fragment implements PhotoAlbumAdapter.OnItemClickListener {

        private RecyclerView recyclerView;
        private RecyclerView.LayoutManager layoutManager;
        PhotoAlbumAdapter mAdapter;
           FetchMoviePoster movie_fetch;
        public MainActivityFragment() {
        }


        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setHasOptionsMenu(true);
        }

        @Override
        public void onCreateOptionsMenu(Menu menu, MenuInflater inflater) {

            inflater.inflate(R.menu.movie_sort, menu);
        }

        @Override
        public boolean onOptionsItemSelected(MenuItem item) {

            int id = item.getItemId();
            if (id == R.id.action_sort) {

                return true;
            }
            if(id== R.id.pop){
                updateMovie("popularity.desc");
                return true;
            }
            if(id== R.id.vote){
                updateMovie("vote_average.desc");
                return true;
            }


            return super.onOptionsItemSelected(item);
        }




        @Override
        public View onCreateView(LayoutInflater inflater, ViewGroup container,
                                 Bundle savedInstanceState) {
            View rootView = inflater.inflate(R.layout.fragment_main, container, false);

            recyclerView = (RecyclerView) rootView.findViewById(R.id.recyle_view);
            recyclerView.setHasFixedSize(true);
            layoutManager = new GridLayoutManager(getActivity(), 2, GridLayoutManager.VERTICAL, false);

            recyclerView.setLayoutManager(layoutManager);
           movie_fetch= new FetchMoviePoster();

            registerForContextMenu(recyclerView);
            updateMovie("vote_count.desc");
            return rootView;
        }

        private void updateMovie(String c) {
            movie_fetch.execute(c);
        }

        @Override
        public void onCreateContextMenu(ContextMenu menu, View v,
                                        ContextMenu.ContextMenuInfo menuInfo) {
            super.onCreateContextMenu(menu, v, menuInfo);
            getActivity().getMenuInflater().inflate(R.menu.pop_up_menu, menu);
        }

        public void update_the_Adaptor(String[] st){
            mAdapter = new PhotoAlbumAdapter(new ArrayList<>(Arrays.asList(st)), getContext());
            recyclerView.setAdapter(mAdapter);
            mAdapter.SetOnItemClickListener(MainActivityFragment.this);
        }


        @Override
        public void onItemClick(View view, int position) {
            Log.v("Actual position", Integer.toString(position));
            Intent detail= new Intent(getActivity(),DetailActivity.class);
            detail.putExtra("position",position);
            detail.putExtra("poster", movie_fetch.resultStrs);

            detail.putExtra("title",movie_fetch. movie_title);
            detail.putExtra("plot", movie_fetch.movie_plot);
            detail.putExtra("user_rating", movie_fetch.user_rating);
            detail.putExtra("release", movie_fetch.release_date);
            startActivity(detail);
        }
    }




    My PhotoAlbumAdapterClass



    public class PhotoAlbumAdapter extends RecyclerView.Adapter<PhotoAlbumAdapter.ViewHolder> {
        ArrayList<String> image;
        Context context;

        OnItemClickListener mClickListener;
        public PhotoAlbumAdapter(ArrayList<String> imageView, Context context) {
            image=imageView;
            this.context=context;
        }

        @Override
        public PhotoAlbumAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
            View v= LayoutInflater.from(parent.getContext()).inflate(R.layout.image_holder,parent,false);
            ViewHolder vh=new ViewHolder(v);
            return vh;
        }

        @Override
        public void onBindViewHolder(final PhotoAlbumAdapter.ViewHolder holder, int position) {
            String st=image.get(position);
            Uri uri=Uri.parse(st);
            Picasso.with(context).load(uri)
                    .into(holder.img);


            AnimationsUtils.animate(holder);

        }

        @Override
        public int getItemCount() {

            return image.size();

        }

        public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{

            ImageView img;

            public ViewHolder(View itemView) {
                super(itemView);
                img = (ImageView) itemView.findViewById(R.id.imageView);
                itemView.setOnClickListener(this);
            }

            @Override
            public void onClick(View view) {
                if(mClickListener !=null)
                    mClickListener.onItemClick(view, getAdapterPosition()); //OnItemClickListener mItemClickListener;
            }
        }

        public interface OnItemClickListener {
            void onItemClick(View view, int position);
        }
        public void SetOnItemClickListener(final OnItemClickListener m){
            mClickListener=m;
        }
    }



    My FetchMoviePoster class


    public class FetchMoviePoster extends AsyncTask<String, Void, String[]> {
        private final String LOG_TAG = FetchMoviePoster.class.getSimpleName();

        String choice;
        String[] resultStrs;
        String[] movie_title;
        String[] movie_plot;
        String[] user_rating;
        String[] release_date;
        @Override
        protected String[] doInBackground(String... code) {

            HttpURLConnection urlConnection = null;
            BufferedReader reader = null;
            String[] image_poster = new String[0];
            String API = "api_key";
            String SORT="sort_by";

            choice=code[0];
            String forecastJsonStr = null;

            try {
                Uri fetch_url = Uri.parse("http://api.themoviedb.org/3/discover/movie?");
                Uri builder = fetch_url.buildUpon().
                        appendQueryParameter(SORT,choice)
                        .appendQueryParameter(API, BuildConfig.THE_MOVIE_DB_API_KEY).build();
                URL url = new URL(builder.toString());



                urlConnection = (HttpURLConnection) url.openConnection();
                urlConnection.setRequestMethod("GET");
                urlConnection.connect();

                InputStream inputStream = urlConnection.getInputStream();
                StringBuffer buffer = new StringBuffer();
                if (inputStream == null) {
                    // Nothing to do.
                    return null;
                }
                reader = new BufferedReader(new InputStreamReader(inputStream));

                String line;
                while ((line = reader.readLine()) != null) {
                    buffer.append(line + "/n");
                }

                if (buffer.length() == 0) {
                    return null;
                }
                forecastJsonStr = buffer.toString();


                try {
                    image_poster = getUrlForImage(forecastJsonStr);

                } catch (JSONException e) {
                    e.printStackTrace();
                }


            } catch (IOException e) {
                Log.e(LOG_TAG, "Error ", e);
                // If the code didn't successfully get the weather data, there's no point in attempting
                // to parse it.
                forecastJsonStr = null;
            } finally {
                if (urlConnection != null) {
                    urlConnection.disconnect();
                }
                if (reader != null) {
                    try {
                        reader.close();
                    } catch (final IOException e) {
                        Log.e(LOG_TAG, "Error closing stream", e);
                    }
                }
            }
            return image_poster;
        }

        private String[] getUrlForImage(String forecastJsonStr) throws JSONException {
            final String OWM_POSTER = "results";
            final String FILE_PATH = "poster_path";
            final String ORIGINAL_TITLE="original_title";
            final String OVERVIEW="overview";
            final String User_RATING="vote_average";
            final String RELEASE="release_date";

            JSONObject forecastJson = new JSONObject(forecastJsonStr);
            JSONArray movieArray = forecastJson.getJSONArray(OWM_POSTER);
            resultStrs = new String[movieArray.length()];
            movie_title=new String[movieArray.length()];
            movie_plot=new String[movieArray.length()];
            user_rating=new String[movieArray.length()];
            release_date=new String[movieArray.length()];
            for (int i = 0; i < movieArray.length(); i++) {

                JSONObject movie = movieArray.getJSONObject(i);

                String file_name = movie.getString(FILE_PATH);
                String title=movie.getString(ORIGINAL_TITLE);
                String plot=movie.getString(OVERVIEW);
                String userRating=movie.getString(User_RATING);
                String release=movie.getString(RELEASE);
                resultStrs[i] = "http://image.tmdb.org/t/p/w185/" +file_name;
                movie_title[i]=title;
                movie_plot[i]=plot;
                user_rating[i]= userRating;
                release_date[i]=release;
            }

            return resultStrs;
        }

        @Override
        protected void onPostExecute(String[] resultStrs) {
            if (resultStrs != null) {

                 new MainActivityFragment().update_the_Adaptor(resultStrs);

            }

        }
    }
new MainActivityFragment().update_the_Adaptor(resultStrs);
public类MainActivityFragment扩展片段实现PhotoAlbumAdapter.OnItemClickListener{
私人回收站;
private RecyclerView.LayoutManager LayoutManager;
相册适配器;
FetchMoviePoster电影_fetch;
公共维护活动片段(){
}
@凌驾
创建时的公共void(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
设置选项菜单(真);
}
@凌驾
创建选项菜单(菜单菜单,菜单充气机){
充气机。充气(右菜单。电影排序,菜单);
}
@凌驾
公共布尔值onOptionsItemSelected(菜单项项){
int id=item.getItemId();
if(id==R.id.action\u排序){
返回true;
}
if(id==R.id.pop){
updateMovie(“popularity.desc”);
返回true;
}
如果(id==R.id.vote){
updateMovie(“vote_average.desc”);
返回true;
}
返回super.onOptionsItemSelected(项目);
}
@凌驾
创建视图上的公共视图(布局、充气机、视图组容器、,
Bundle savedInstanceState){
视图根视图=充气机。充气(R.layout.fragment_main,容器,错误);
recyclerView=(recyclerView)rootView.findViewById(R.id.recyle\u视图);
recyclerView.setHasFixedSize(true);
layoutManager=新的GridLayoutManager(getActivity(),2,GridLayoutManager.VERTICAL,false);
recyclerView.setLayoutManager(layoutManager);
movie_fetch=new FetchMoviePoster();
registerForContextMenu(recyclerView);
updateMovie(“vote_count.desc”);
返回rootView;
}
私有void updateMovie(字符串c){
电影_fetch.execute(c);
}
@凌驾
public void onCreateContextMenu(ContextMenu,视图v,
ContextMenu.ContextMenuInfo menuInfo){
super.onCreateContextMenu(menu,v,menuInfo);
getActivity().getMenuInflater()充气(右菜单弹出菜单,菜单);
}
公共无效更新\u适配器(字符串[]st){
mAdapter=newPhotoAlbumAdapter(newArrayList(Arrays.asList(st)),getContext());
recyclerView.setAdapter(mAdapter);
SetOnItemClickListener(MainActivityFragment.this);
}
@凌驾
公共虚线单击(视图,int位置){
Log.v(“实际位置”,整数.toString(位置));
Intent detail=新的意图(getActivity(),DetailActivity.class);
细节。额外(“位置”,位置);
detail.putExtra(“海报”,movie_fetch.resultStrs);
detail.putExtra(“title”,movie\u fetch.movie\u title);
detail.putExtra(“plot”,movie\u fetch.movie\u plot);
detail.putExtra(“用户分级”,电影分级,用户分级);
detail.putExtra(“发布”,电影获取,发布日期);
星触觉(细节);
}
}
我的相册适配器类
公共类PhotoAlbumAdapter扩展了RecyclerView.Adapter{
阵列列表图像;
语境;
McClickListener McClickListener;
公共相册适配器(ArrayList imageView,上下文){
图像=图像视图;
this.context=context;
}
@凌驾
public PhotoAlbumAdapter.ViewHolder onCreateViewHolder(视图组父级,int-viewType){
视图v=LayoutInflater.from(parent.getContext()).flate(R.layout.image\u holder,parent,false);
视窗支架vh=新视窗支架(v);
返回vh;
}
@凌驾
公共无效onBindViewHolder(最终相册适配器。ViewHolder支架,内部位置){
字符串st=image.get(位置);
Uri=Uri.parse(st);
Picasso.with(context.load)(uri)
.into(holder.img);
AnimationsUtils.animate(保持器);
}
@凌驾
public int getItemCount(){
返回image.size();
}
公共类ViewHolder扩展了RecyclerView.ViewHolder实现了View.OnClickListener{
图像视图img;
公共视图持有者(视图项视图){
超级(项目视图);
img=(ImageView)itemView.findViewById(R.id.ImageView);
setOnClickListener(这个);
}
@凌驾
公共void onClick(视图){
if(mClickListener!=null)
onItemClick(视图,getAdapterPosition());//OnItemClickListener mItemClickListener;
}
}
公共接口侦听器{
void onItemClick(视图,int位置);
}
公共无效SetOnItemClickListener(最终OnItemClickListener m){
mClickListener=m;
}
}
我的电影海报课
公共类FetchMoviePoster扩展异步任务{
私有最终字符串LOG_TAG=FetchMoviePoster.class.getSimpleName();
字符串选择;
字符串[]resultStrs;
字符串[]电影名称;
字符串[]电影情节;
字符串[]用户等级;
字符串[]发布日期;
@凌驾
受保护字符串[]doInBackground(字符串。。。
public void update_the_Adaptor(String[] st){
            // st is not null
            mAdapter = new PhotoAlbumAdapter(new ArrayList<>(Arrays.asList(st)), getContext());
            recyclerView.setAdapter(mAdapter);//null recycler view as onCreate is not called
            mAdapter.SetOnItemClickListener(MainActivityFragment.this);
        }