为什么recycleview数据不能从服务器端数据库中的数据同步 [英] Why recycleview data cannot sync with data from server side database

查看:389
本文介绍了为什么recycleview数据不能从服务器端数据库中的数据同步的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用RESTAPI提供在Android中的数据我的应用程序和数据库,我使用phpMyAdmin,并做到在本地主机

,一切顺利,但是当我在数据库中添加新的数据我 recycleview 不能与数据库中最新的数据同步,所以当我轻扫或滚动我刚才添加的最新数据显示为双我的 recycleview ,它会永远不会结束。我使用模拟器来运行的apk。

如果有人能帮助我解决我的code我真的AP preciate它。这里是我的 customVolleyRequest code:

 公共类CustomVolleyRequest {    私有静态CustomVolleyRequest customVolleyRequest;
    私有静态上下文的背景下;
    私人请求队列请求队列;
    私人ImageLoader的ImageLoader的;    私人CustomVolleyRequest(上下文的背景下){
        this.context =背景;
        this.requestQueue = getRequestQueue();        ImageLoader的=新ImageLoader的(请求队列,
                新ImageLoader.ImageCache(){
                    私人最终LruCache<弦乐,位图>
                            缓存=新LruCache<弦乐,位图>(20);                    @覆盖
                    公共位图getBitmap(字符串URL){
                        返回cache.get(URL);
                    }                    @覆盖
                    公共无效putBitmap(字符串URL,位图位图){
                        cache.put(URL,位图);
                    }
                });
    }    同步CustomVolleyRequest的getInstance(上下文的背景下)公共静态{
        如果(customVolleyRequest == NULL){
            customVolleyRequest =新CustomVolleyRequest(背景);
        }
        返回customVolleyRequest;
    }    公共请求队列getRequestQueue(){
        如果(请求队列== NULL){
            缓存缓存=新DiskBasedCache(context.getCacheDir(),10 * 1024 * 1024);
            网络网络=新BasicNetwork(新HurlStack());
            请求队列=新的请求队列(缓存,网络);
            requestQueue.start();
        }
        返回请求队列;
    }    公共ImageLoader的getImageLoader(){
        返回ImageLoader的;
    }
}

这是我的的AppConfig 类存储标签:

 公共类的AppConfig {
    //服务器用户登录网址
    公共静态字符串URL_LOGIN =htt​​p://192.168.0.13:80/task_manager/v1/login;    //服务器用户注册网址
    公共静态字符串URL_REGISTER =htt​​p://192.168.0.13/task_manager/v1/register;    //我的网址,甚至
    公共静态最后弦乐DATA_URL =htt​​p://192.168.0.13/task_manager/v1/even/;    //标签为我的JSON    公共静态最后弦乐TAG_IMAGE_URL =甘巴尔
    公共静态最后弦乐TAG_JUDUL =judul;
    公共静态最后弦乐TAG_DESKRIPSI =deskripsi;
    公共静态最后弦乐TAG_DUIT =duit;
    公共静态最后弦乐TAG_PERSEN =佩尔森;
    公共静态最后弦乐TAG_SISA_HARI =sisahari;
}

这是getter和setter:

 公共类事件{
        //数据变量
        私人字符串图片网址;
        私人字符串名称;
        私人字符串排名;
        私人诠释真实姓名;
        私人诠释createdBy;
        私人诠释firstAppearance;
        //私人的ArrayList<串GT;权力;        // getter和setter
        公共字符串getImageUrl(){
            返回图片网址;
        }        公共无效setImageUrl(字符串图片网址){
            this.imageUrl =图片网址;
        }        //获取和设置JUDUL
        公共字符串getJudul(){
            返回名称;
        }        公共无效setJudul(字符串名称){
            this.name =名称;
        }        //获取和设置DESKRIPSI
        公共字符串getDeskripsi(){
            返回等级;
        }        公共无效setDeskripsi(串级){
            this.rank =排名;
        }        //获取和设置DUIT        公众诠释getDuit(){
            回到真实姓名;
        }        公共无效setDuit(INT实名){
            this.realName =真实姓名;
        }        //获取和设置佩尔森        公众诠释getPersen(){
            返回createdBy;
        }        公共无效setPersen(INT createdBy){
            this.createdBy = createdBy;
        }        //获取和设置SISA HARI        公众诠释getSisaHari(){
            返回firstAppearance;
        }        公共无效setSisaHari(INT firstAppearance){
            this.firstAppearance = firstAppearance;
        }
    }

这是我的主要片段:

 包com.anakacara.anakacara.Fragment;进口android.content.Context;
进口android.content.Intent;
进口android.net.Uri;
进口android.os.Bundle;
进口android.support.v4.app.Fragment;
进口android.support.v4.widget.SwipeRefreshLayout;
进口android.support.v7.widget.DefaultItemAnimator;
进口android.support.v7.widget.LinearLayoutManager;
进口android.support.v7.widget.RecyclerView;
进口android.view.GestureDetector;
进口android.view.LayoutInflater;
进口android.view.MotionEvent;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.ProgressBar;
进口android.widget.Toast;进口com.anakacara.anakacara.App.AppConfig;
进口com.anakacara.anakacara.App.Event;
进口com.anakacara.anakacara.Helper.CardAdapter;
进口com.anakacara.anakacara.R;
进口com.anakacara.anakacara.activity.DetailEvent;
进口com.android.volley.RequestQueue;
进口com.android.volley.Response;
进口com.android.volley.VolleyError;
进口com.android.volley.toolbox.JsonArrayRequest;
进口com.android.volley.toolbox.Volley;进口org.json.JSONArray;
进口org.json.JSONException;
进口org.json.JSONObject;进口的java.util.ArrayList;
进口的java.util.List;/ **
 *一个简单的{@link片段}子类。
 *包含此片段必须实现活动
 * {@link EventFragment.OnFragmentInteractionListener}接口
 *处理交互事件。
 *使用{@link EventFragment#}的newInstance工厂方法
 *创建该片段的一个实例。
 * /
公共类EventFragment扩展片段实现SwipeRefreshLayout.OnRefreshListener {
    // TODO:重命名参数的参数,选择匹配的名字
    //片段初始化参数,例如ARG_ITEM_NUMBER
    私有静态最后弦乐ARG_PARAM1 =参数1;
    私有静态最后弦乐ARG_PARAM2 =参数2;    // TODO:重命名和更改类型的参数
    私人字符串mParam1;
    私人字符串mParam2;    //创建活动列表
    私人列表<事件>的ListEvent;    //创建视图
    私人RecyclerView recyclerView;
    私人RecyclerView.LayoutManager的layoutManager;
    私人RecyclerView.Adapter适配器;
    私人INT requestCount = 1;
    私人诠释清单;
    私人OnFragmentInteractionListener mListener;
    私人请求队列请求队列;
    私人进度进度;
    私人SwipeRefreshLayout swipeRefreshLayout;
    公共EventFragment(){
        //必需的空公共构造
    }    / **
     *使用此工厂方法来创建新实例
     *使用提供的参数,这个片段。
     *
     * @参数参数1参数1。
     * @参数参数2参数2。
     返回:片段EventFragment的一个新实例。
     * /
    // TODO:重命名和更改类型和参数个数
    公共静态的newInstance EventFragment(字符串参数1,字符串参数2){
        EventFragment片段=新EventFragment();
        捆绑ARGS =新包();
        args.putString(ARG_PARAM1,参数1);
        args.putString(ARG_PARAM2,参数2);
        fragment.setArguments(参数);
        返回片段;
    }    @覆盖
    公共无效的onCreate(捆绑savedInstanceState){
        super.onCreate(savedInstanceState);
        如果(getArguments()!= NULL){
            mParam1 = getArguments()的getString(ARG_PARAM1)。
            mParam2 = getArguments()的getString(ARG_PARAM2)。
        }
    }    私人最终RecyclerView.OnScrollListener onScrollListener =新RecyclerView.OnScrollListener(){
        @覆盖
        公共无效onScrollStateChanged(最终RecyclerView recyclerView,最终诠释newState){
            // code        }        @覆盖
        公共无效onScrolled(最终RecyclerView recyclerView,最终诠释DX,最终诠释DY){
            // code
            如果(isLastItemDisplaying(recyclerView)){
                //再次调用该方法的getData
                的getData();
            }
        }
    };
    @覆盖
    公共查看onCreateView(LayoutInflater充气器,容器的ViewGroup,
                             捆绑savedInstanceState){
        //充气的布局该片段
        查看X = inflater.inflate(R.layout.fragment_event,NULL);;
        进度=(进度)x.findViewById(R.id.progressBar1);
        recyclerView =(RecyclerView)x.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(真);
        的layoutManager =新LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(的layoutManager);        的ListEvent =新的ArrayList<>();
        请求队列= Volley.newRequestQueue(getActivity());        swipeRefreshLayout =(SwipeRefreshLayout)x.findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setOnRefreshListener(本);        / **
         *上的活动显示刷卡刷新动画制作
         *由于动画将不启动的onCreate,可运行后使用
         * /
        swipeRefreshLayout.post(新的Runnable(){
                                    @覆盖
                                    公共无效的run(){
                                        swipeRefreshLayout.setRefreshing(真);                                        的getData();                                    }
                                }
        );        //的ListEvent =新的ArrayList<>();
        //请求队列= Volley.newRequestQueue(getActivity());
        //调用方法来获取数据
        //因为如果你看到这个方法被调用两次
        //的getData();// swipeRefreshLayout =(SwipeRefreshLayout)x.findViewById(R.id.swipeRefreshLayout);
// swipeRefreshLayout.setOnRefreshListener(新SwipeRefreshLayout.OnRefreshListener()
// {
// @覆盖
//公共无效onRefresh()
// {
//如果(isLastItemDisplaying(recyclerView)){
////再次调用该方法的getData
//的getData();
// progressBar.setVisibility(View.GONE);
//}
//}
//});
        recyclerView.addOnScrollListener(rVOnScrollListener);
        适配器=新CardAdapter(的ListEvent,getActivity());        //添加适配器recyclerview
        recyclerView.setAdapter(适配器);
        RecyclerView.ItemAnimator itemAnimator =新DefaultItemAnimator();
        itemAnimator.setAddDuration(1000);
        itemAnimator.setRemoveDuration(1000);
        recyclerView.setItemAnimator(itemAnimator);
        recyclerView.addOnItemTouchListener(新RecyclerTouchListener(getActivity(),recyclerView,新ClickListener(){
            @覆盖
            公共无效的onClick(查看视图,INT位置){
                意向意图=新意图(getActivity(),DetailEvent.class);
                intent.putExtra(event_judul,listEvent.get(位置).getJudul()); //你可以命名任何你喜欢的钥匙
                intent.putExtra(event_deskripsi,listEvent.get(位置).getDeskripsi()); //注意,所有这些值必须是原语(即布尔,INT,双,字符串等)
                intent.putExtra(event_duit,listEvent.get(位置).getDuit());
                intent.putExtra(event_persen,listEvent.get(位置).getPersen()); //注意,所有这些值必须是原语(即布尔,INT,双,字符串等)
                intent.putExtra(event_sisa_hari,listEvent.get(位置).getSisaHari());
                intent.putExtra(event_image,listEvent.get(位置).getImageUrl());
                startActivity(意向);
            }            @覆盖
            公共无效onLongClick(查看视图,INT位置){
                Toast.makeText(getActivity(),Kepencet喇嘛+位置,Toast.LENGTH_LONG).show();
            }
        }));        返回X;
    }
    私人JsonArrayRequest getDataFromServer(INT requestCount){
        //初始化进度        swipeRefreshLayout.setRefreshing(真);
        //显示进度
        progressBar.setVisibility(View.VISIBLE);
// getActivity()的getParent()setProgressBarIndeterminateVisibility(真)。        凌空// JsonArrayRequest
        JsonArrayRequest jsonArrayRequest =新JsonArrayRequest(AppConfig.DATA_URL +将String.valueOf(requestCount)
                新Response.Listener< JSONArray>(){
                    @覆盖
                    公共无效onResponse(JSONArray响应){
                        //调用方法parseData来解析JSON响应
                        parseData(响应);                        //隐藏进度
                        progressBar.setVisibility(View.GONE);
                        swipeRefreshLayout.setRefreshing(假);
                    }
                },
                新Response.ErrorListener(){
                    @覆盖
                    公共无效onErrorResponse(VolleyError错误){
                        progressBar.setVisibility(View.GONE);
                        //如果发生错误,这意味着该列表的末尾已达
                        Toast.makeText(getActivity(),没有更多的项目可用+列表,Toast.LENGTH_SHORT).show();
                        swipeRefreshLayout.setRefreshing(假);
                    }
                });        //返回请求
        返回jsonArrayRequest;
    }    私人无效的getData(){
        //通过调用方法添加方法到队列getDataFromServer        requestQueue.add(getDataFromServer(requestCount));
        //递增请求计数器
    }    //此方法将解析JSON数据    私人无效parseData(JSONArray数组){
        的for(int i = 0; I< array.length();我++){
            事件事件=新事件();
            JSONObject的JSON = NULL;
            尝试{
                JSON = array.getJSONObject(ⅰ);                event.setJudul(json.getString(AppConfig.TAG_JUDUL));
                event.setDeskripsi(json.getString(AppConfig.TAG_DESKRIPSI));
                event.setDuit(json.getInt(AppConfig.TAG_DUIT));
                event.setPersen(json.getInt(AppConfig.TAG_PERSEN));
                event.setSisaHari(json.getInt(AppConfig.TAG_SISA_HARI));
                event.setImageUrl(json.getString(AppConfig.TAG_IMAGE_URL));
                event.setTotal(json.getInt(AppConfig.TAG_TOTAL));
            }赶上(JSONException E){
                e.printStackTrace();
            }
            listEvent.add(事件);
        }
        adapter.notifyDataSetChanged();        如果(requestCount&下; = listEvent.get(0).getTotal()){
            requestCount ++;
        }
        //初始化最后我们适配器    }
    // TODO:重命名方法,更新参数和勾法将UI事件
    公共无效onButton pressed(URI URI){
        如果(mListener!= NULL){
            mListener.onFragmentInteraction(URI);
        }
    }    @覆盖
    公共无效onAttach(上下文的背景下){
        super.onAttach(上下文);
        如果(上下文的instanceof OnFragmentInteractionListener){
            mListener =(OnFragmentInteractionListener)范围内;
        }其他{
            抛出新的RuntimeException(context.toString()
                    +必须实现OnFragmentInteractionListener);
        }
    }    @覆盖
    公共无效onDetach(){
        super.onDetach();
        mListener = NULL;
    }    @覆盖
    公共无效onRefresh(){
        如果(isLastItemDisplaying(recyclerView)){
            的getData();
        }
    }
    类RecyclerTouchListener实现RecyclerView.OnItemTouchListener {
        私人GestureDetector mGestureDetector;
        私人ClickListener mClickListener;
        公共RecyclerTouchListener(最终上下文的背景下,最终RecyclerView recyclerView,最终ClickListener clickListener){
            this.mClickListener = clickListener;
            mGestureDetector =新GestureDetector(上下文,新GestureDetector.SimpleOnGestureListener(){
                @覆盖
                公共布尔onSingleTapUp(MotionEvent五){
                    返回true;
                }                @覆盖
                公共无效onLong preSS(MotionEvent五){
                    视图儿童= recyclerView.findChildViewUnder(e.getX(),e.​​getY());
                    如果(孩子= NULL&放大器;!&安培;!clickListener = NULL){
                        clickListener.onLongClick(儿童,recyclerView.getChildAdapterPosition(子));
                    }
                    super.onLong preSS(E);
                }
            });
        }        @覆盖
        公共布尔onInterceptTouchEvent(RecyclerView RV,MotionEvent五){
            视图儿童= rv.findChildViewUnder(e.getX(),e.​​getY());
            如果(孩子= NULL&放大器;!&安培; mClickListener = NULL&放大器;!&安培; mGestureDetector.onTouchEvent(E)){
                mClickListener.onClick(儿童,rv.getChildAdapterPosition(子));
            }
            返回false;
        }        @覆盖
        公共无效onTouchEvent(RecyclerView RV,MotionEvent五){        }        @覆盖
        公共无效onRequestDisallowInterceptTouchEvent(布尔disallowIntercept){        }
    }    私人布尔isLastItemDisplaying(RecyclerView recyclerView){
        如果(recyclerView.getAdapter()。getItemCount()!= 0){
            INT lastVisibleItemPosition =((LinearLayoutManager)recyclerView.getLayoutManager())findLastCompletelyVisibleItemPosition();
            如果(lastVisibleItemPosition = RecyclerView.NO_POSITION&放大器;&放大器;!lastVisibleItemPosition == recyclerView.getAdapter()getItemCount() - 1)
                返回true;
        }
        返回false;
    }
    私人RecyclerView.OnScrollListener rVOnScrollListener =新RecyclerView.OnScrollListener(){
        @覆盖
        公共无效onScrollStateChanged(RecyclerView recyclerView,
                                         INT newState){
            super.onScrollStateChanged(recyclerView,newState);
// Toast.makeText(getApplicationContext(),
// Config.DATA_URL +将String.valueOf(requestCount),Toast.LENGTH_LONG).show();
        }        @覆盖
        公共无效onScrolled(RecyclerView recyclerView,诠释DX,DY INT){
            super.onScrolled(recyclerView,DX,DY);
            如果(isLastItemDisplaying(recyclerView)){
//再次调用该方法的getData
                的getData();
                progressBar.setVisibility(View.GONE);
            }        }
    };
    公共静态界面ClickListener {
        公共无效的onClick(查看视图,诠释位);
        公共无效onLongClick(查看视图,诠释位);
    }
    / **
     *此接口必须由包含此活动的实施
     *片段,以允许在该片段的相互作用来传达
     *中包含的活性和潜在的其它片段
     *活动。
     *所述p为H.;
     *请参阅Android的培训课< A HREF =
     *http://developer.android.com/training/basics/fragments/communicating.html
     *>在其他片段&所述通信; / A>了解更多信息。
     * /
    公共接口OnFragmentInteractionListener {
        // TODO:更新参数类型和名称
        无效onFragmentInteraction(URI URI);
    }
}

下面是我的适配器:

 包com.anakacara.anakacara.Helper;/ **
 *创建者Philipus于2016年5月3日。
 * /进口android.content.Context;
进口android.support.v7.widget.RecyclerView;
进口android.view.LayoutInflater;
进口android.view.View;
进口android.view.ViewGroup;
进口android.widget.TextView;进口com.anakacara.anakacara.App.CustomVolleyRequest;
进口com.anakacara.anakacara.App.Event;
进口com.anakacara.anakacara.R;
进口com.android.volley.toolbox.ImageLoader;
进口com.android.volley.toolbox.NetworkImageView;进口的java.util.List;/ **
 *创建者贝拉尔在2015年11月9日。
 * /
公共类CardAdapter扩展RecyclerView.Adapter< CardAdapter.ViewHolder> {    私人ImageLoader的ImageLoader的;
    私人上下文的背景下;    // eventes一览
    清单<事件> eventes;    公共CardAdapter(列表<事件> eventes,上下文的背景下){
        超();
        //所有获取eventA
        this.eventes = eventes;
        this.context =背景;
    }    @覆盖
    公共ViewHolder onCreateViewHolder(ViewGroup中的父母,INT viewType){
        视图V = LayoutInflater.from(parent.getContext())
                .inflate(R.layout.event_list,父母,假);
        ViewHolder viewHolder =新ViewHolder(V);
        返回viewHolder;
    }    @覆盖
    公共无效onBindViewHolder(ViewHolder持有人,INT位置){        事件事件= eventes.get(位置);        ImageLoader的= CustomVolleyRequest.getInstance(上下文).getImageLoader();
        imageLoader.get(event.getImageUrl(),ImageLoader.getImageListener(holder.imageView,R.mipmap.ic_launcher,android.R.drawable.ic_dialog_alert));        holder.imageView.setImageUrl(event.getImageUrl(),ImageLoader的);
        holder.textViewJudul.setText(event.getJudul());
        holder.textViewRank.setText(event.getDeskripsi());
        holder.textViewRealName.setText(将String.valueOf(event.getDuit()));
        holder.textViewCreatedBy.setText(将String.valueOf(event.getPersen()));
        holder.textViewFirstAppearance.setText(将String.valueOf(event.getSisaHari()));
    }    @覆盖
    公众诠释getItemCount(){
        返回eventes.size();
    }    类ViewHolder扩展RecyclerView.ViewHolder {
        公共NetworkImageView ImageView的;
        公众的TextView textViewJudul;
        公众的TextView textViewRank;
        公众的TextView textViewRealName;
        公众的TextView textViewCreatedBy;
        公众的TextView textViewFirstAppearance;
//公共的TextView textViewPowers;        公共ViewHolder(查看ItemView控件){
            超(ItemView控件);
            ImageView的=(NetworkImageView)itemView.findViewById(R.id.imageViewHero);
            textViewJudul =(TextView中)itemView.findViewById(R.id.textViewJudul);
            textViewRank =(TextView中)itemView.findViewById(R.id.textViewRank);
            textViewRealName =(TextView中)itemView.findViewById(R.id.textViewRealName);
            textViewCreatedBy =(TextView中)itemView.findViewById(R.id.textViewCreatedBy);
            textViewFirstAppearance =(TextView中)itemView.findViewById(R.id.textViewFirstAppearance);        }
    }
}


解决方案

使用排的队列onRequestFinishedLitener到notifay数据集的改变。

 类RequestListener实现RequestQueue.RequestFinishedListener {        @覆盖
        公共无效onRequestFinished(请求请求){
   adapter.notifyDatasetChanged();     }
}

然后

  RequestListener RL =新RequestListener();
volley_queue.addRequestFinishedListener(监听);

如果您希望在列表在走向终结装载新的数据。你必须让你的API中,趴在服务器页面。你将不得不通过网页访问网页。根据该列表到达结束你打电话parseJson的下一个页面。

您将有打电话给你parseJSON方法,其中包含一个数据新的链接。为此,您将有加ReyclerView的OnScrollListener。

 类RecyclerViewOnScroll扩展RecyclerView.OnScrollListener
    {
        INT temp_page_position;
        @覆盖
        公共无效onScrollStateChanged(RecyclerView recyclerView,诠释newState){
            super.onScrollStateChanged(recyclerView,newState);
            如果((则为list.size() - 1 == layoutManager.findLastVisibleItemPosition())){
  //进入阻止时RecyclerView的最后一项出现。
}
}
}

I am using restapi to provide data to my app in android and for the database I am using phpmyadmin and do it in localhost, everything goes well, but when I am adding new data in database my recycleview cannot sync with newest data in database so when I swipe or scroll the newest data that I have just added appear as double in my recycleview and it will never end. I am using an emulator to run the apk.

If anyone can help me fix my code I really appreciate it. Here is my customVolleyRequest code:

public class CustomVolleyRequest {

    private static CustomVolleyRequest customVolleyRequest;
    private static Context context;
    private RequestQueue requestQueue;
    private ImageLoader imageLoader;

    private CustomVolleyRequest(Context context) {
        this.context = context;
        this.requestQueue = getRequestQueue();

        imageLoader = new ImageLoader(requestQueue,
                new ImageLoader.ImageCache() {
                    private final LruCache<String, Bitmap>
                            cache = new LruCache<String, Bitmap>(20);

                    @Override
                    public Bitmap getBitmap(String url) {
                        return cache.get(url);
                    }

                    @Override
                    public void putBitmap(String url, Bitmap bitmap) {
                        cache.put(url, bitmap);
                    }
                });
    }

    public static synchronized CustomVolleyRequest getInstance(Context context) {
        if (customVolleyRequest == null) {
            customVolleyRequest = new CustomVolleyRequest(context);
        }
        return customVolleyRequest;
    }

    public RequestQueue getRequestQueue() {
        if (requestQueue == null) {
            Cache cache = new DiskBasedCache(context.getCacheDir(), 10 * 1024 * 1024);
            Network network = new BasicNetwork(new HurlStack());
            requestQueue = new RequestQueue(cache, network);
            requestQueue.start();
        }
        return requestQueue;
    }

    public ImageLoader getImageLoader() {
        return imageLoader;
    }
}

This is my appconfig class for storing tag:

public class AppConfig {
    // Server user login url
    public static String URL_LOGIN = "http://192.168.0.13:80/task_manager/v1/login";

    // Server user register url
    public static String URL_REGISTER = "http://192.168.0.13/task_manager/v1/register";

    //URL of my even
    public static final String DATA_URL = "http://192.168.0.13/task_manager/v1/even/";

    //Tags for my JSON

    public static final String TAG_IMAGE_URL = "gambar";
    public static final String TAG_JUDUL = "judul";
    public static final String TAG_DESKRIPSI = "deskripsi";
    public static final String TAG_DUIT = "duit";
    public static final String TAG_PERSEN = "persen";
    public static final String TAG_SISA_HARI = "sisahari";
}

This is getter and setter:

public class Event {
        //Data Variables
        private String imageUrl;
        private String name;
        private String rank;
        private int realName;
        private int createdBy;
        private int firstAppearance;
        //private ArrayList<String> powers;

        //Getters and Setters
        public String getImageUrl() {
            return imageUrl;
        }

        public void setImageUrl(String imageUrl) {
            this.imageUrl = imageUrl;
        }

        //GET AND SET JUDUL
        public String getJudul() {
            return name;
        }

        public void setJudul(String name) {
            this.name = name;
        }

        //GET AND SET DESKRIPSI
        public String getDeskripsi() {
            return rank;
        }

        public void setDeskripsi(String rank) {
            this.rank = rank;
        }

        //GET AND SET DUIT

        public int getDuit() {
            return realName;
        }

        public void setDuit(int realName) {
            this.realName = realName;
        }

        //GET AND SET PERSEN

        public int getPersen() {
            return createdBy;
        }

        public void setPersen(int createdBy) {
            this.createdBy = createdBy;
        }

        //GET AND SET SISA HARI

        public int getSisaHari() {
            return firstAppearance;
        }

        public void setSisaHari(int firstAppearance) {
            this.firstAppearance = firstAppearance;
        }
    }

And this is my main fragment:

package com.anakacara.anakacara.Fragment;

import android.content.Context;
import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.support.v4.app.Fragment;
import android.support.v4.widget.SwipeRefreshLayout;
import android.support.v7.widget.DefaultItemAnimator;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.GestureDetector;
import android.view.LayoutInflater;
import android.view.MotionEvent;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ProgressBar;
import android.widget.Toast;

import com.anakacara.anakacara.App.AppConfig;
import com.anakacara.anakacara.App.Event;
import com.anakacara.anakacara.Helper.CardAdapter;
import com.anakacara.anakacara.R;
import com.anakacara.anakacara.activity.DetailEvent;
import com.android.volley.RequestQueue;
import com.android.volley.Response;
import com.android.volley.VolleyError;
import com.android.volley.toolbox.JsonArrayRequest;
import com.android.volley.toolbox.Volley;

import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import java.util.ArrayList;
import java.util.List;

/**
 * A simple {@link Fragment} subclass.
 * Activities that contain this fragment must implement the
 * {@link EventFragment.OnFragmentInteractionListener} interface
 * to handle interaction events.
 * Use the {@link EventFragment#newInstance} factory method to
 * create an instance of this fragment.
 */
public class EventFragment extends Fragment implements SwipeRefreshLayout.OnRefreshListener {
    // TODO: Rename parameter arguments, choose names that match
    // the fragment initialization parameters, e.g. ARG_ITEM_NUMBER
    private static final String ARG_PARAM1 = "param1";
    private static final String ARG_PARAM2 = "param2";

    // TODO: Rename and change types of parameters
    private String mParam1;
    private String mParam2;

    //Creating a List of event
    private List<Event> listEvent;

    //Creating Views
    private RecyclerView recyclerView;
    private RecyclerView.LayoutManager layoutManager;
    private RecyclerView.Adapter adapter;
    private int requestCount = 1;
    private int list;
    private OnFragmentInteractionListener mListener;
    private RequestQueue requestQueue;
    private ProgressBar progressBar;
    private SwipeRefreshLayout swipeRefreshLayout;
    public EventFragment() {
        // Required empty public constructor
    }

    /**
     * Use this factory method to create a new instance of
     * this fragment using the provided parameters.
     *
     * @param param1 Parameter 1.
     * @param param2 Parameter 2.
     * @return A new instance of fragment EventFragment.
     */
    // TODO: Rename and change types and number of parameters
    public static EventFragment newInstance(String param1, String param2) {
        EventFragment fragment = new EventFragment();
        Bundle args = new Bundle();
        args.putString(ARG_PARAM1, param1);
        args.putString(ARG_PARAM2, param2);
        fragment.setArguments(args);
        return fragment;
    }

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        if (getArguments() != null) {
            mParam1 = getArguments().getString(ARG_PARAM1);
            mParam2 = getArguments().getString(ARG_PARAM2);
        }
    }

    private final RecyclerView.OnScrollListener onScrollListener = new RecyclerView.OnScrollListener() {
        @Override
        public void onScrollStateChanged(final RecyclerView recyclerView, final int newState) {
            // code

        }

        @Override
        public void onScrolled(final RecyclerView recyclerView, final int dx, final int dy) {
            // code
            if (isLastItemDisplaying(recyclerView)) {
                //Calling the method getdata again
                getData();
            }
        }
    };
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        // Inflate the layout for this fragment
        View x =  inflater.inflate(R.layout.fragment_event,null);;
        progressBar = (ProgressBar) x.findViewById(R.id.progressBar1);
        recyclerView = (RecyclerView) x.findViewById(R.id.recyclerView);
        recyclerView.setHasFixedSize(true);
        layoutManager = new LinearLayoutManager(getActivity());
        recyclerView.setLayoutManager(layoutManager);

        listEvent = new ArrayList<>();
        requestQueue = Volley.newRequestQueue(getActivity());

        swipeRefreshLayout = (SwipeRefreshLayout) x.findViewById(R.id.swipeRefreshLayout);
        swipeRefreshLayout.setOnRefreshListener(this);

        /**
         * Showing Swipe Refresh animation on activity create
         * As animation won't start on onCreate, post runnable is used
         */
        swipeRefreshLayout.post(new Runnable() {
                                    @Override
                                    public void run() {
                                        swipeRefreshLayout.setRefreshing(true);

                                        getData();

                                    }
                                }
        );

        // listEvent = new ArrayList<>();
        // requestQueue = Volley.newRequestQueue(getActivity());
        //Calling method to get data
        //this method is called twice as if you see
        // getData();

//        swipeRefreshLayout= (SwipeRefreshLayout) x.findViewById(R.id.swipeRefreshLayout);
//        swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener()
//        {
//            @Override
//            public void onRefresh()
//            {
//                if (isLastItemDisplaying(recyclerView)) {
////Calling the method getdata again
//                    getData();
//                    progressBar.setVisibility(View.GONE);
//                }
//            }
//        });
        recyclerView.addOnScrollListener(rVOnScrollListener);
        adapter = new CardAdapter(listEvent, getActivity());

        //Adding adapter to recyclerview
        recyclerView.setAdapter(adapter);
        RecyclerView.ItemAnimator itemAnimator = new DefaultItemAnimator();
        itemAnimator.setAddDuration(1000);
        itemAnimator.setRemoveDuration(1000);
        recyclerView.setItemAnimator(itemAnimator);
        recyclerView.addOnItemTouchListener(new RecyclerTouchListener(getActivity(), recyclerView, new ClickListener() {
            @Override
            public void onClick(View view, int position) {
                Intent intent = new Intent(getActivity(), DetailEvent.class);
                intent.putExtra("event_judul", listEvent.get(position).getJudul()); //you can name the keys whatever you like
                intent.putExtra("event_deskripsi", listEvent.get(position).getDeskripsi()); //note that all these values have to be primitive (i.e boolean, int, double, String, etc.)
                intent.putExtra("event_duit", listEvent.get(position).getDuit());
                intent.putExtra("event_persen", listEvent.get(position).getPersen()); //note that all these values have to be primitive (i.e boolean, int, double, String, etc.)
                intent.putExtra("event_sisa_hari", listEvent.get(position).getSisaHari());
                intent.putExtra("event_image", listEvent.get(position).getImageUrl());
                startActivity(intent);
            }

            @Override
            public void onLongClick(View view, int position) {
                Toast.makeText(getActivity(), "Kepencet Lama " + position, Toast.LENGTH_LONG).show();
            }
        }));

        return x;
    }
    private JsonArrayRequest getDataFromServer(int requestCount) {
        //Initializing ProgressBar

        swipeRefreshLayout.setRefreshing(true);
        //Displaying Progressbar
        progressBar.setVisibility(View.VISIBLE);
//        getActivity().getParent().setProgressBarIndeterminateVisibility(true);

        //JsonArrayRequest of volley
        JsonArrayRequest jsonArrayRequest = new JsonArrayRequest(AppConfig.DATA_URL + String.valueOf(requestCount),
                new Response.Listener<JSONArray>() {
                    @Override
                    public void onResponse(JSONArray response) {
                        //Calling method parseData to parse the json response
                        parseData(response);

                        //Hiding the progressbar
                        progressBar.setVisibility(View.GONE);
                        swipeRefreshLayout.setRefreshing(false);
                    }
                },
                new Response.ErrorListener() {
                    @Override
                    public void onErrorResponse(VolleyError error) {
                        progressBar.setVisibility(View.GONE);
                        //If an error occurs that means end of the list has reached
                        Toast.makeText(getActivity(), "No More Items Available"+list, Toast.LENGTH_SHORT).show();
                        swipeRefreshLayout.setRefreshing(false);
                    }
                });

        //Returning the request
        return jsonArrayRequest;
    }

    private void getData() {
        //Adding the method to the queue by calling the method getDataFromServer

        requestQueue.add(getDataFromServer(requestCount));
        //Incrementing the request counter


    }

    //This method will parse json data

    private void parseData(JSONArray array) {
        for (int i = 0; i < array.length(); i++) {
            Event event = new Event();
            JSONObject json = null;
            try {
                json = array.getJSONObject(i);

                event.setJudul(json.getString(AppConfig.TAG_JUDUL));
                event.setDeskripsi(json.getString(AppConfig.TAG_DESKRIPSI));
                event.setDuit(json.getInt(AppConfig.TAG_DUIT));
                event.setPersen(json.getInt(AppConfig.TAG_PERSEN));
                event.setSisaHari(json.getInt(AppConfig.TAG_SISA_HARI));
                event.setImageUrl(json.getString(AppConfig.TAG_IMAGE_URL));
                event.setTotal(json.getInt(AppConfig.TAG_TOTAL));


            } catch (JSONException e) {
                e.printStackTrace();
            }
            listEvent.add(event);
        }
        adapter.notifyDataSetChanged();

        if( requestCount <= listEvent.get(0).getTotal())    {
            requestCount++;
        }


        //Finally initializing our adapter

    }
    // TODO: Rename method, update argument and hook method into UI event
    public void onButtonPressed(Uri uri) {
        if (mListener != null) {
            mListener.onFragmentInteraction(uri);
        }
    }

    @Override
    public void onAttach(Context context) {
        super.onAttach(context);
        if (context instanceof OnFragmentInteractionListener) {
            mListener = (OnFragmentInteractionListener) context;
        } else {
            throw new RuntimeException(context.toString()
                    + " must implement OnFragmentInteractionListener");
        }
    }

    @Override
    public void onDetach() {
        super.onDetach();
        mListener = null;
    }

    @Override
    public void onRefresh() {
        if (isLastItemDisplaying(recyclerView)) {
            getData();
        }
    }


    class RecyclerTouchListener implements RecyclerView.OnItemTouchListener{
        private GestureDetector mGestureDetector;
        private ClickListener mClickListener;


        public RecyclerTouchListener(final Context context, final RecyclerView recyclerView, final ClickListener clickListener) {
            this.mClickListener = clickListener;
            mGestureDetector = new GestureDetector(context,new GestureDetector.SimpleOnGestureListener(){
                @Override
                public boolean onSingleTapUp(MotionEvent e) {
                    return true;
                }

                @Override
                public void onLongPress(MotionEvent e) {
                    View child = recyclerView.findChildViewUnder(e.getX(),e.getY());
                    if (child!=null && clickListener!=null){
                        clickListener.onLongClick(child, recyclerView.getChildAdapterPosition(child));
                    }
                    super.onLongPress(e);
                }
            });
        }

        @Override
        public boolean onInterceptTouchEvent(RecyclerView rv, MotionEvent e) {
            View child = rv.findChildViewUnder(e.getX(), e.getY());
            if (child!=null && mClickListener!=null && mGestureDetector.onTouchEvent(e)){
                mClickListener.onClick(child, rv.getChildAdapterPosition(child));
            }
            return false;
        }

        @Override
        public void onTouchEvent(RecyclerView rv, MotionEvent e) {

        }

        @Override
        public void onRequestDisallowInterceptTouchEvent(boolean disallowIntercept) {

        }
    }

    private boolean isLastItemDisplaying(RecyclerView recyclerView) {
        if (recyclerView.getAdapter().getItemCount() != 0) {
            int lastVisibleItemPosition = ((LinearLayoutManager) recyclerView.getLayoutManager()).findLastCompletelyVisibleItemPosition();
            if (lastVisibleItemPosition != RecyclerView.NO_POSITION && lastVisibleItemPosition == recyclerView.getAdapter().getItemCount() - 1)
                return true;
        }
        return false;
    }
    private RecyclerView.OnScrollListener rVOnScrollListener = new RecyclerView.OnScrollListener(){
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView,
                                         int newState) {
            super.onScrollStateChanged(recyclerView, newState);
//            Toast.makeText(getApplicationContext(),
//                    Config.DATA_URL+String.valueOf(requestCount), Toast.LENGTH_LONG).show();
        }

        @Override
        public void onScrolled(RecyclerView recyclerView, int dx, int dy) {
            super.onScrolled(recyclerView, dx, dy);
            if (isLastItemDisplaying(recyclerView)) {
//Calling the method getdata again
                getData();
                progressBar.setVisibility(View.GONE);
            }

        }
    };
    public static interface ClickListener{
        public void onClick(View view, int position);
        public void onLongClick(View view, int position);
    }
    /**
     * This interface must be implemented by activities that contain this
     * fragment to allow an interaction in this fragment to be communicated
     * to the activity and potentially other fragments contained in that
     * activity.
     * <p>
     * See the Android Training lesson <a href=
     * "http://developer.android.com/training/basics/fragments/communicating.html"
     * >Communicating with Other Fragments</a> for more information.
     */
    public interface OnFragmentInteractionListener {
        // TODO: Update argument type and name
        void onFragmentInteraction(Uri uri);
    }
}

Here is my adapter:

package com.anakacara.anakacara.Helper;

/**
 * Created by Philipus on 05/03/2016.
 */

import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;

import com.anakacara.anakacara.App.CustomVolleyRequest;
import com.anakacara.anakacara.App.Event;
import com.anakacara.anakacara.R;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;

import java.util.List;

/**
 * Created by Belal on 11/9/2015.
 */
public class CardAdapter extends RecyclerView.Adapter<CardAdapter.ViewHolder> {

    private ImageLoader imageLoader;
    private Context context;

    //List of eventes
    List<Event> eventes;

    public CardAdapter(List<Event> eventes, Context context){
        super();
        //Getting all the eventA
        this.eventes = eventes;
        this.context = context;
    }

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

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

        Event event =  eventes.get(position);

        imageLoader = CustomVolleyRequest.getInstance(context).getImageLoader();
        imageLoader.get(event.getImageUrl(), ImageLoader.getImageListener(holder.imageView, R.mipmap.ic_launcher, android.R.drawable.ic_dialog_alert));

        holder.imageView.setImageUrl(event.getImageUrl(), imageLoader);
        holder.textViewJudul.setText(event.getJudul());
        holder.textViewRank.setText(event.getDeskripsi());
        holder.textViewRealName.setText(String.valueOf(event.getDuit()));
        holder.textViewCreatedBy.setText(String.valueOf(event.getPersen()));
        holder.textViewFirstAppearance.setText(String.valueOf(event.getSisaHari()));


    }

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

    class ViewHolder extends RecyclerView.ViewHolder {
        public NetworkImageView imageView;
        public TextView textViewJudul;
        public TextView textViewRank;
        public TextView textViewRealName;
        public TextView textViewCreatedBy;
        public TextView textViewFirstAppearance;
//        public TextView  textViewPowers;

        public ViewHolder(View itemView) {
            super(itemView);
            imageView = (NetworkImageView) itemView.findViewById(R.id.imageViewHero);
            textViewJudul = (TextView) itemView.findViewById(R.id.textViewJudul);
            textViewRank= (TextView) itemView.findViewById(R.id.textViewRank);
            textViewRealName= (TextView) itemView.findViewById(R.id.textViewRealName);
            textViewCreatedBy= (TextView) itemView.findViewById(R.id.textViewCreatedBy);
            textViewFirstAppearance= (TextView) itemView.findViewById(R.id.textViewFirstAppearance);

        }
    }
}

解决方案

use onRequestFinishedLitener of Volley queue to notifay data set changed.

class RequestListener implements RequestQueue.RequestFinishedListener {

        @Override
        public void onRequestFinished(Request request) {
   adapter.notifyDatasetChanged();

     }
}

Then

RequestListener rl = new RequestListener();
volley_queue.addRequestFinishedListener(listener);

if you want to load new data when list comes to the end. you will have to make pages in your API which lying on server. you will have to access page by page. As per the list reaches to end you call parseJson for next page.

you will have call your parseJSON method with new link which contains next data. For this you will have add OnScrollListener of ReyclerView.

 class RecyclerViewOnScroll extends RecyclerView.OnScrollListener
    {
        int temp_page_position;
        @Override
        public void onScrollStateChanged(RecyclerView recyclerView, int newState) {
            super.onScrollStateChanged(recyclerView, newState);
            if ((list.size()-1 == layoutManager.findLastVisibleItemPosition())) {  
  // Enters to block when last item of RecyclerView has appeared.
}
}
}

这篇关于为什么recycleview数据不能从服务器端数据库中的数据同步的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆