来自MainActivity

时间:2017-11-18 09:05:00

标签: android json android-fragments android-recyclerview

请找我解决这个问题,我在url api中有一个图像列表json,列表url api正在从后台任务调用,并且在compliting后调用了notify方法它没有显示

Recyclerview没有刷新 - 只有当我返回并重新打开活动时 - 才会显示新数据。

那么如何通知适配器要显示的新数据?

1.WallpaperFragmentAdapter.java

public class WallpaperFragmentAdapter extends Fragment {

   List<WallpaperMain> wallpaperList = new ArrayList<WallpaperMain>();
   WallPaperAdapter wallPaperAdapter;

    @Bind(R.id.recyclerView)
    RecyclerView recyclerView;

    private int tabId ;



    public void settabId(int tabId){
        this.tabId=tabId;
    }

    public static Fragment newInstance(Context context) {

        WallpaperFragmentAdapter f = new WallpaperFragmentAdapter();
        return f;
    }

    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
        ViewGroup root = (ViewGroup) inflater.inflate(R.layout.content_main, null);
        setUpView(root);
        return root;
    }

    void setUpView(ViewGroup root){
        ButterKnife.bind(this, root);
        setUPList();
    }

    void setUPList(){

        new WallPaperListDownlaoderTask().execute("http://localhost:8080/api/motivation/wallpaper/wallpaper");

        recyclerView.setLayoutManager(new LinearLayoutManager(getActivity()));
        GridLayoutManager gridLayoutManager = new GridLayoutManager(getActivity(),3);
        wallPaperAdapter = new WallPaperAdapter(wallpaperList,getActivity());
        recyclerView.setAdapter(wallPaperAdapter);
        recyclerView.setLayoutManager(gridLayoutManager);
        System.out.println(wallPaperAdapter);
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new RecyclerTouchListener.ClickListener() {
            @Override
            public void onClick(View view, int position) {

                Intent intent;
                intent = new Intent(getActivity(), WallpaperDeatilsActivity.class);
                startActivity(intent);
            }

            @Override
            public void onLongClick(View view, int position) {

            }
        }));


    }

     class WallPaperListDownlaoderTask extends AsyncTask<String,Integer,JSONArray> {

        OkHttpClient client = new OkHttpClient();

         @Override
         protected void onPreExecute() {
             super.onPreExecute();

         }

        @Override
        protected JSONArray doInBackground(String... params) {

            String url =params[0];

            Request request = new Request.Builder()
                    .url(url)
                    .build();
            try{
                Response response = client.newCall(request).execute();
                String apiResponseString=response.body().string();
                System.out.println("response.body().toString() ---- "+apiResponseString );

                JSONArray jsonArray = new  JSONArray(apiResponseString);

                List<WallpaperMain> wallpaperMains = new ArrayList<>();

                for(int index =0;index<jsonArray.length();index++){

                    try {
                        JSONObject wallpaperMainsJsonObj = jsonArray.getJSONObject(index);
                        WallpaperMain wallpaperMain = new WallpaperMain();
                        wallpaperMain.setId(wallpaperMainsJsonObj.getInt("id"));
                        Wallpaper wallpaper = new Wallpaper();

                        JSONObject wallpaperJsonObj = wallpaperMainsJsonObj.getJSONObject("wallpaper");
                        wallpaper.setLarge(wallpaperJsonObj.getString("large"));
                        wallpaperMain.setWallpaper(wallpaper);
                        wallpaperMains.add(wallpaperMain);
                    } catch (JSONException e) {
                        e.printStackTrace();
                    }

                }

                wallpaperList =wallpaperMains;

                return null;

            }catch (IOException e){
                Log.v("",e.toString());
            } catch (JSONException e) {
                e.printStackTrace();
            }
            return null;
        }

        @Override
        protected void onPostExecute(JSONArray jsonArray) {

           super.onPostExecute(jsonArray);
            System.out.println(wallPaperAdapter);
            wallPaperAdapter.notifyDataSetChanged();
            recyclerView.setAdapter(wallPaperAdapter);
            System.out.println(wallpaperList.size());
        }
    }

}

2.WallPaperAdapter.java

public class WallPaperAdapter extends RecyclerView.Adapter<WallPaperAdapter.MyViewHolder>{


    private List<WallpaperMain> wallpaperMains;
    private Context context;

    public WallPaperAdapter(List<WallpaperMain> wallpaperMains,Context context){
        this.wallpaperMains =wallpaperMains;
        this.context=context;
    }

    @Override
    public WallPaperAdapter.MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {

        View itemLayoutView = LayoutInflater.from(parent.getContext()).inflate(R.layout.wallpaper_item, null);
        WallPaperAdapter.MyViewHolder viewHolder = new WallPaperAdapter.MyViewHolder(itemLayoutView);
        return viewHolder;
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        Glide.with(context)
                .load("http://localhost:8080/api/motivation/wallpaper/large/37l")
                .into(holder.waIlpapermageView);

       // holder.waIlpapermageView.setImageResource(R.drawable.name);
    }

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

    public class MyViewHolder extends RecyclerView.ViewHolder {


        ImageView waIlpapermageView;
        public MyViewHolder(View itemView) {
            super(itemView);
            waIlpapermageView =(ImageView) itemView.findViewById(R.id.wallpaperItem_imageView);
        }
    }
}

输出我收到了吼叫

enter image description here

2 个答案:

答案 0 :(得分:3)

COPY (SELECT language, title, FROM cms_title WHERE language != 'en' AND title != 'Blog' ) to '/home/www/html/cms_title_dump.csv' DELIMITER ',' CSV HEADER 方法中,而不是

doInBackground

使用

wallpaperList = wallpaperMains;

wallpaperList.clear(); wallpaperList.addAll(wallpaperMains);

onPostExecute()

答案 1 :(得分:2)

试试这个......

在添加值Arraylist On onPreExecute()方法之前,请先清除wallpaperList.clear();

 recyclerView.setAdapter(wallPaperAdapter);
        wallPaperAdapter.notifyDataSetChanged();

只要您的ArrayList值发生变化,请使用notifyDataSetChanged();它会刷新您的Recylierview