2016-01-20 128 views
1

我在ArchiveActivity中有一个RecyclerView,它使用json填充,每件事情都可以,但是当我刷新刷新布局时,什么也没有发生,现在我的问题是,我怎么能检索新json和填充RecyclerView,并没有与setOnScrollListenerMethod冲突:如何刷新RecyclerView,并刷新刷新布局时使用新的Json refreshLayout

这是activity_archive.xml

<?xml version="1.0" encoding="utf-8"?> 
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    xmlns:tools="http://schemas.android.com/tools" 
    android:layout_width="match_parent" 
    android:layout_height="match_parent" 
    android:background="#e6e6e6" 
    tools:context=".activities.ArchiveActivity"> 

    <android.support.v7.widget.Toolbar 
     android:id="@+id/archiveToolbar" 
     android:background="#34465d" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     android:minHeight="?attr/actionBarSize"/> 
    <Button 
     android:id="@+id/btnVideo" 
     android:layout_below="@+id/archiveToolbar" 
     android:text="Video Activity" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" /> 

    <android.support.v4.widget.SwipeRefreshLayout 
     android:id="@+id/swipe_refresh_layout_archive" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content"> 


    <android.support.v7.widget.RecyclerView 
     android:id="@+id/archiveRecylerView" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent" 
     android:layout_below="@+id/btnVideo"/> 

    </android.support.v4.widget.SwipeRefreshLayout> 


</RelativeLayout> 

,这是ArchiveActivity

import android.app.ProgressDialog; 
import android.content.Intent; 
import android.graphics.Color; 
import android.support.v4.widget.SwipeRefreshLayout; 
import android.support.v7.app.AppCompatActivity; 
import android.os.Bundle; 
import android.support.v7.widget.LinearLayoutManager; 
import android.support.v7.widget.RecyclerView; 
import android.support.v7.widget.Toolbar; 
import android.util.Log; 
import android.view.View; 
import android.widget.Button; 
import com.android.volley.Request; 
import com.android.volley.Response; 
import com.android.volley.VolleyError; 
import com.android.volley.toolbox.JsonObjectRequest; 
import com.majid.aparat.R; 
import com.majid.aparat.adapter.ArchiveRecyclerAdapter; 
import com.majid.aparat.app.AppController; 
import com.majid.aparat.pojo.VideoData; 
import org.json.JSONArray; 
import org.json.JSONException; 
import org.json.JSONObject; 
import java.util.ArrayList; 
import java.util.List; 
import android.os.Handler; 
import android.widget.Toast; 

public class ArchiveActivity extends AppCompatActivity { 

    // ============ Global Variables ================ // 
    ProgressDialog progressDialog; 
    List<VideoData> videoDataList = new ArrayList<VideoData>(); 
    RecyclerView archiveRecyclerView; 
    ArchiveRecyclerAdapter adapter; 
    private String after_url; 

    private SwipeRefreshLayout swipeRefreshLayout; 


    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_archive); 

     String TAG = ArchiveActivity.class.getSimpleName(); 

     setUpToolbar(); 

     // ========== btn Video Activity =========== // 
     Button btnVideo = (Button) findViewById(R.id.btnVideo); 
     btnVideo.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       startActivity(new Intent(ArchiveActivity.this, WatchActivity.class)); 
      } 
     }); 

     //======== SwipeRefreshLayout init ======// 

     swipeRefreshLayout = (SwipeRefreshLayout)findViewById(R.id.swipe_refresh_layout_archive); 
     swipeRefreshLayout.setColorSchemeResources(R.color.red , R.color.green , R.color.blue); 
     swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 
       new Handler().postDelayed(new Runnable() { 
        @Override 
        public void run() { 

         sendJsonRequest(); 
         swipeRefreshLayout.setRefreshing(false); 
        } 
       } , 1500); 
      } 
     }); 

     // ========================= sending jsonRequest ======================= // 
     sendJsonRequest(); 
     showPD(); 
     //========================= initialize recyclerView ===========================// 

     archiveRecyclerView = (RecyclerView) findViewById(R.id.archiveRecylerView); 
     archiveRecyclerView.setHasFixedSize(true); 
     LinearLayoutManager linearLayoutManager = new LinearLayoutManager(ArchiveActivity.this); 
     archiveRecyclerView.setLayoutManager(linearLayoutManager); 
     archiveRecyclerView.setOnScrollListener(new EndlessRecyclerOnScrollListener(linearLayoutManager) { 
      @Override 
      public void onLoadMore(int current_page) { 
       loadMore(); 
       Toast.makeText(ArchiveActivity.this , "onLoadMore is calling" , Toast.LENGTH_SHORT).show(); 
      } 
     }); 
     adapter = new ArchiveRecyclerAdapter(this, videoDataList); 
     archiveRecyclerView.setAdapter(adapter); 
    } 

    //========================= send json request ===========================// 
    private void sendJsonRequest() { 

     //========================= get Category intent ===========================// 
     Intent intent = getIntent(); 
     String catUrl = intent.getStringExtra("category"); 

     String fUrl = String.format("http://www.aparat.com//etc/api/categoryvideos/%s", catUrl); 

     JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, fUrl, (String) null, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       videoDataList.clear(); 
       parsJsonResponse(response); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       Log.d("TAG", error.toString()); 
      } 
     }); 
     AppController.getInstance().addToRequestQueue(request); 
    } 

     //========================= parse json response ===========================// 

private void parsJsonResponse(JSONObject response) { 

    if (response != null) { 
     try { 
      JSONObject ui = response.getJSONObject("ui"); 
      after_url = ui.getString("pagingForward"); 

      JSONArray categoryViedeos = response.getJSONArray("lastvideos"); 
      for (int i = 0; i < categoryViedeos.length(); i++) { 
       JSONObject currentVideo = categoryViedeos.getJSONObject(i); 

       VideoData viNew = new VideoData(); 

       viNew.setVideoThumbnail(currentVideo.getString("small_poster")); 
       viNew.setVideoTitle(currentVideo.getString("title")); 
       viNew.setVideoCount(currentVideo.getString("visit_cnt")); 
       viNew.setVideoDate(currentVideo.getString("sdate")); 

       videoDataList.add(viNew); 
      } 
      adapter.addMoreItems(videoDataList); 
      hidePD(); 

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


    //========================= LoadMore for infinitie scroll ===========================// 

    private void loadMore() { 
     //Toast.makeText(ArchiveActivity.this , "we are loading !!!" ,Toast.LENGTH_SHORT).show(); 
     showPD(); 

     JsonObjectRequest request = new JsonObjectRequest(Request.Method.GET, after_url, (String)null, new Response.Listener<JSONObject>() { 
      @Override 
      public void onResponse(JSONObject response) { 
       hidePD(); 
       parsJsonResponse(response); 
      } 
     }, new Response.ErrorListener() { 
      @Override 
      public void onErrorResponse(VolleyError error) { 
       //Error 
      } 
     }); 
     AppController.getInstance().addToRequestQueue(request); 
    } 

    //========================= setUpToolbar ===========================// 
    private void setUpToolbar() { 

     Intent intent = getIntent(); 
     String catName = intent.getStringExtra("catName"); 

     Toolbar archiveToolbar = (Toolbar) findViewById(R.id.archiveToolbar); 
     //Toast.makeText(this , catUrl , Toast.LENGTH_SHORT).show(); 

     setSupportActionBar(archiveToolbar); 
     archiveToolbar.setTitleTextColor(Color.WHITE); 
     getSupportActionBar().setTitle(catName); 
     getSupportActionBar().setDisplayHomeAsUpEnabled(true); 
     getSupportActionBar().setHomeAsUpIndicator(R.mipmap.ic_left); 

    } 

    //========================= showPD Method ===========================// 
    private void showPD() { 
     if (progressDialog == null) { 
      progressDialog = new ProgressDialog(this); 
      progressDialog.setMessage("در حال بارگزاری "); 
      progressDialog.setCancelable(false); 
      progressDialog.setCanceledOnTouchOutside(false); 
      progressDialog.show(); 
     } 
    } 

    //========================= hidePD Method ===========================// 
    private void hidePD() { 
     if (progressDialog != null) { 
      progressDialog.dismiss(); 
      progressDialog = null; 
     } 
    } 
} 

,这是ArchiveRecyclerAdapter

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.ImageView; 
import android.widget.TextView; 
import android.widget.Toast; 

import com.bumptech.glide.Glide; 
import com.majid.aparat.adapter.ArchiveRecyclerAdapter.ViewHolder; 
import com.majid.aparat.pojo.VideoData; 
import com.majid.aparat.R; 
import java.util.List; 

/** 
* Created by majid on 18/01/2016. 
*/ 
public class ArchiveRecyclerAdapter extends RecyclerView.Adapter<ArchiveRecyclerAdapter.ViewHolder> { 

    //================== Global Var 
    Context context; 
    List<VideoData> videoDataList ; 

    //=================== Constructor ============================= // 

    public ArchiveRecyclerAdapter(Context context , List<VideoData> videoDataList) { 

     this.context = context; 
     this.videoDataList = videoDataList; 
    } 

    //=================== ViewHolder ============================= // 
    public class ViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener{ 
     private ImageView imgThumbnailVideo; 
     private TextView txtTitleVideo; 
     private TextView txtCountVideo; 
     private TextView txtDateVideo; 

     public ViewHolder(View itemView) { 
      super(itemView); 
      itemView.setOnClickListener(this); 

      imgThumbnailVideo = (ImageView)itemView.findViewById(R.id.imgThumnailVideo); 
      txtTitleVideo = (TextView)itemView.findViewById(R.id.txtVideoTitle); 
      txtDateVideo = (TextView)itemView.findViewById(R.id.txtVideoDate); 
      txtCountVideo = (TextView) itemView.findViewById(R.id.txtVideoCount); 
     } 

     @Override 
     public void onClick(View v) { 
      Toast.makeText(v.getContext() , txtTitleVideo.getText() , Toast.LENGTH_SHORT).show(); 
     } 
    } 


    //=================== OnCreateViewHolder ============================= // 
    @Override 
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { 

     View rootView = LayoutInflater.from(parent.getContext()).inflate(R.layout.video_item_row , null); 

     ViewHolder viewHolder = new ViewHolder(rootView); 

     return viewHolder; 
    } 

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

     Context context = holder.itemView.getContext(); 

     VideoData currentVideoData = videoDataList.get(position); 

     Glide.with(context).load(currentVideoData.getVideoThumbnail()).into(holder.imgThumbnailVideo); 
     holder.txtTitleVideo.setText(currentVideoData.getVideoTitle()); 
     holder.txtCountVideo.setText(currentVideoData.getVideoCount()); 
     holder.txtDateVideo.setText(currentVideoData.getVideoDate()); 

    } 

    //=================== getItemCount ============================= // 
    @Override 
    public int getItemCount() { 
     return videoDataList.size(); 
    } 

//=================== addMoreItems ========================== // 

    public void addMoreItems(List<VideoData> videoDataList){ 
     this.videoDataList.addAll(videoDataList); 
    } 
    } 
+0

显示'ArchiveRecyclerAdapter'类代码也 –

+0

之前调用addMoreItems方法parsJsonResponse在你的'addMoreItems'刷新你的适配器 – Piyush

+0

,我可以删除'adapter.notify'之后,我的意思是parseJsonResponse –

回答

0

只是打电话adapter.notifyDataSetChanged();不会在当前适配器数据源添加新的项目。

得到它的工作创造一个方法ArchiveRecyclerAdapter像在数据源中添加新项目:

public void addMoreItems(List<VideoData> videoDataList){ 
    this.videoDataList.addAll(videoDataList); 
} 

现在呼吁adapter.notifyDataSetChanged();

+0

感谢您的帮助,但仍然有问题 –

+0

我在'adapter.notify'之前添加'adapter.addMoreItems(videoDataList)',但仍然没有任何发生 –

+0

@kianarahimi:请显示更新的代码 –