studio recyclerview hacer como android android-fragments android-volley android-cardview pull-to-refresh

hacer - Tire para actualizar recyclerview android



refresh listview android (4)

Hola, tengo una actividad de pestañas y, en la primera pestaña, busco datos del servidor y los muestro en una vista de reciclaje dentro de las vistas de tarjeta. Para obtener los datos del servidor, uso la biblioteca de voleas. Quiero implementar el Pull para actualizar para cargar los datos (así que cada vez que tire debe hacer la solicitud a la red). Y también quiero deshabilitar la solicitud de red cada vez que cambio entre pestañas (porque cuando cambio el enfoque de la pestaña en mi aplicación comienza a buscar datos) Quiero hacer la solicitud de red solo 1 vez (cuando el usuario inicia sesión por primera vez) y luego Otras solicitudes se manejan solo por tirar para actualizar.

Aquí está mi fragmento donde recyclerview y muestro los datos:

public class Tab1History extends Fragment { private RecyclerView recyclerView; private CespiteAdapter adapter; UserSessionManager session; private static final String URL_DATA = "http://mydata.php"; private List<CespiteOgg> cespiteOggList; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.tab1history, container, false); recyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view); recyclerView.setHasFixedSize(true);//every item of the RecyclerView has a fix size recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); cespiteOggList = new ArrayList<>(); loadRecyclerViewData(); return rootView; } private void loadRecyclerViewData() { // Session class instance session = new UserSessionManager(getActivity()); //get user data from session HashMap<String, String> user = session.getUserDetails(); //get name String name = user.get(UserSessionManager.KEY_NAME); // get username final String usernameUtente = user.get(UserSessionManager.KEY_USERNAME); final ProgressDialog progressDialog = new ProgressDialog(getActivity()); progressDialog.setMessage("Carimento dati..."); progressDialog.show(); StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_DATA, new Response.Listener<String>() { @Override public void onResponse(String s) { progressDialog.dismiss(); try { JSONObject jsonObject = new JSONObject(s); JSONArray array = jsonObject.getJSONArray("dates"); for(int i=0; i<array.length(); i++) { JSONObject o = array.getJSONObject(i); CespiteOgg item = new CespiteOgg( o.getString("CodNumInventario"), o.getString("Nome"), o.getString("DtCatalogazione"), o.getString("CodIdA"), o.getString("username") ); cespiteOggList.add(item); } adapter = new CespiteAdapter(cespiteOggList, getActivity()); recyclerView.setAdapter(adapter); } catch (JSONException e) { e.printStackTrace(); } } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { progressDialog.dismiss(); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("Username", usernameUtente); return params; } }; RegisterRequest.getmInstance(getActivity()).addToRequestque(stringRequest); } }

Y es el adaptador:

public class CespiteAdapter extends RecyclerView.Adapter<CespiteAdapter.ViewHolder> { private List<CespiteOgg> cespiteOggList; private Context context; public CespiteAdapter(List<CespiteOgg> cespiteOggList, Context context) { this.cespiteOggList = cespiteOggList; this.context = context; } public class ViewHolder extends RecyclerView.ViewHolder { public CardView cv; public TextView txtNumInventario; public TextView txtNomeCespite; public TextView txtDtCatalogazione; public TextView txtAula; public TextView txtNomeUser; ViewHolder(View itemView) { super (itemView); //cv = (CardView) itemView.findViewById(R.id.cardView); txtNumInventario = (TextView) itemView.findViewById(R.id.txtNumeroInventario); txtNomeCespite = (TextView) itemView.findViewById(R.id.txtNomeCespite); txtDtCatalogazione = (TextView) itemView.findViewById(R.id.txtDataCatalogazione); txtAula = (TextView) itemView.findViewById(R.id.txtAula); txtNomeUser= (TextView) itemView.findViewById(R.id.txtNomeUser); } } @Override public CespiteAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) { LayoutInflater inflater = LayoutInflater.from(parent.getContext()); View cespiteView = inflater.inflate(R.layout.cespite_card_view, parent, false); return new ViewHolder(cespiteView); } @Override public void onBindViewHolder(ViewHolder holder, int position) { CespiteOgg cespiteOgg = cespiteOggList.get(position); holder.txtNumInventario.setText(cespiteOgg.getNumInventario()); holder.txtNomeCespite.setText(cespiteOgg.getNomeCespite()); holder.txtDtCatalogazione.setText(cespiteOgg.getDtCatalogazione()); holder.txtAula.setText(cespiteOgg.getAula()); holder.txtNomeUser.setText(cespiteOgg.getNomeUser()); } @Override public int getItemCount() { return cespiteOggList.size(); } }



Ejemplo de Pull to Refresh ListView & RecyclerView en Android Studio - SwipeRefreshLayout. Espero que este código funcione correctamente. Puede probar este código.

Código XML básico de Pull to Refresh / SwipeRefreshLayout:

<android.support.v4.widget.SwipeRefreshLayout android:id="@+id/simpleSwipeRefreshLayout" android:layout_width="match_parent" android:layout_height="wrap_content"> < Add View''s Here..../> </android.support.v4.widget.SwipeRefreshLayout>

A continuación, puede descargar el código, ver el resultado final y una explicación paso a paso del ejemplo básico de recuperación para actualizar. obtenga el código completo con el ejemplo https://abhiandroid.com/materialdesign/pulltorefresh


Puedes usar el widget developer.android.com/training/swipe/add-swipe-interface.html Android en lugar de ProgressDialog .

Siga los pasos a continuación para integrar SwipeRefreshLayout en su fragmento de la Tab1history :

1. En tu tab1history diseño, agrega SwipeRefreshLayout como diseño raíz y coloca RecyclewrView en su interior.

// tab1history.xml <?xml version="1.0" encoding="utf-8"?> <android.support.v4.widget.SwipeRefreshLayout xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/swipe_container" android:layout_width="match_parent" android:layout_height="match_parent"> <android.support.v7.widget.RecyclerView android:id="@+id/my_recycler_view" android:layout_width="match_parent" android:layout_height="match_parent" /> </android.support.v4.widget.SwipeRefreshLayout>

2. En su fragmento Tab1History , use SwipeRefreshLayout como se muestra a continuación para cargar datos desde el servidor:

// Tab1History.java import android.os.Bundle; import android.support.v4.app.Fragment; import android.support.v4.widget.SwipeRefreshLayout; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import com.android.volley.Request; import com.android.volley.Response; import com.android.volley.toolbox.StringRequest; import org.json.JSONArray; import org.json.JSONException; import org.json.JSONObject; import java.util.ArrayList; public class Tab1History extends Fragment implements SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout mSwipeRefreshLayout; private RecyclerView recyclerView; private CespiteAdapter adapter; UserSessionManager session; private static final String URL_DATA = "http://mydata.php"; private List<CespiteOgg> cespiteOggList; @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { View rootView = inflater.inflate(R.layout.tab1history, container, false); recyclerView = (RecyclerView) rootView.findViewById(R.id.my_recycler_view); recyclerView.setHasFixedSize(true);//every item of the RecyclerView has a fix size recyclerView.setLayoutManager(new LinearLayoutManager(getContext())); cespiteOggList = new ArrayList<>(); // SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) rootView.findViewById(R.id.swipe_container); mSwipeRefreshLayout.setOnRefreshListener(this); mSwipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary, android.R.color.holo_green_dark, android.R.color.holo_orange_dark, android.R.color.holo_blue_dark); /** * Showing Swipe Refresh animation on activity create * As animation won''t start on onCreate, post runnable is used */ mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { mSwipeRefreshLayout.setRefreshing(true); // Fetching data from server loadRecyclerViewData(); } }); return rootView; } /** * This method is called when swipe refresh is pulled down */ @Override public void onRefresh() { // Fetching data from server loadRecyclerViewData(); } private void loadRecyclerViewData() { // Showing refresh animation before making http call mSwipeRefreshLayout.setRefreshing(true); // Session class instance session = new UserSessionManager(getActivity()); //get user data from session HashMap<String, String> user = session.getUserDetails(); //get name String name = user.get(UserSessionManager.KEY_NAME); // get username final String usernameUtente = user.get(UserSessionManager.KEY_USERNAME); StringRequest stringRequest = new StringRequest(Request.Method.POST, URL_DATA, new Response.Listener<String>() { @Override public void onResponse(String s) { try { JSONObject jsonObject = new JSONObject(s); JSONArray array = jsonObject.getJSONArray("dates"); for(int i=0; i<array.length(); i++) { JSONObject o = array.getJSONObject(i); CespiteOgg item = new CespiteOgg( o.getString("CodNumInventario"), o.getString("Nome"), o.getString("DtCatalogazione"), o.getString("CodIdA"), o.getString("username") ); cespiteOggList.add(item); } adapter = new CespiteAdapter(cespiteOggList, getActivity()); recyclerView.setAdapter(adapter); } catch (JSONException e) { e.printStackTrace(); } // Stopping swipe refresh mSwipeRefreshLayout.setRefreshing(false); } }, new Response.ErrorListener() { @Override public void onErrorResponse(VolleyError error) { // Stopping swipe refresh mSwipeRefreshLayout.setRefreshing(false); } }) { @Override protected Map<String, String> getParams() throws AuthFailureError { Map<String, String> params = new HashMap<String, String>(); params.put("Username", usernameUtente); return params; } }; RegisterRequest.getmInstance(getActivity()).addToRequestque(stringRequest); } }

Espero que esto funcione correctamente.


Código fuente

https://drive.google.com/open?id=1qjJ_to-1knVNaJB4T3U_L_p_YYNvgAeZ

APK

https://drive.google.com/open?id=1MxQZwjIXgR2jgDkUW1mbFrTLMSaQQisC

public class MainActivity extends AppCompatActivity implements SwipeRefreshLayout.OnRefreshListener { SwipeRefreshLayout mSwipeRefreshLayout; // SwipeRefreshLayout mSwipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe_container); mSwipeRefreshLayout.setOnRefreshListener(this); // mSwipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary, mSwipeRefreshLayout.setColorSchemeResources(R.color.colorAccent, android.R.color.holo_green_dark, android.R.color.holo_orange_dark, android.R.color.holo_blue_dark); /** * Showing Swipe Refresh animation on activity create * As animation won''t start on onCreate, post runnable is used */ mSwipeRefreshLayout.post(new Runnable() { @Override public void run() { if(mSwipeRefreshLayout != null) { mSwipeRefreshLayout.setRefreshing(true); } // TODO Fetching data from server fetchContacts(); } }); @Override public void onRefresh() { fetchContacts(); }