2017-09-28 3 views
-1

Je travaille sur une application de nouvelles et je veux mettre à jour le ListView chaque fois en glissant dans la MainActivity
Voici le code de mon MainActivity ci-dessous:Comment ajouter swipe à rafraîchissement dans une vue liste

package com.infinitystone.mani.news; 

import android.app.LoaderManager; 
import android.app.LoaderManager.LoaderCallbacks; 
import android.content.Context; 
import android.content.Loader; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.customtabs.CustomTabsIntent; 
import android.support.v4.content.ContextCompat; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.TextView; 

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

public class MainActivity extends AppCompatActivity implements LoaderCallbacks<List<News>> { 

    public static final String LOG_TAG = MainActivity.class.getName(); 

    private static final int NEWS_LOADER_ID = 1; 

    private TextView mEmptyView; 

    private NewsAdapter mAdapter; 

    private static final String GUARDIAN_REQUEST_URL = "http://content.guardianapis.com/search?order-by=newest&show-fields=thumbnail&page-size=20&api-key=2f3badbb-4a58-44b8-9800-9ee2a0f445f9"; 

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

     ListView newsList = (ListView) findViewById(R.id.list); 

     mEmptyView = (TextView) findViewById(R.id.empty_view); 
     newsList.setEmptyView(mEmptyView); 

     mAdapter = new NewsAdapter(this, new ArrayList<News>()); 
     newsList.setAdapter(mAdapter); 

     newsList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       News currentNews = mAdapter.getItem(position); 
       Uri uri = Uri.parse(currentNews.getUrl()); 

       CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); 

       builder.setToolbarColor(ContextCompat.getColor(MainActivity.this, R.color.colorPrimary)); 
       builder.setSecondaryToolbarColor(ContextCompat.getColor(MainActivity.this, R.color.colorPrimaryDark)); 

       builder.setShowTitle(true); 

       final Bitmap backButton = BitmapFactory.decodeResource(getResources(), R.drawable.ic_arrow_back_white_24dp); 
       builder.setCloseButtonIcon(backButton); 

       CustomTabsIntent customTabsIntent = builder.build(); 
       customTabsIntent.launchUrl(MainActivity.this, uri); 

      } 
     }); 

     ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 

     if(networkInfo != null && networkInfo.isConnected()){ 
      LoaderManager loaderManager = getLoaderManager(); 

      loaderManager.initLoader(NEWS_LOADER_ID, null, this); 
     } 

     else { 
      View loadingIndicator = findViewById(R.id.loading_indicator); 
      loadingIndicator.setVisibility(View.GONE); 

      mEmptyView.setText(R.string.no_internet); 
     } 
    } 

    @Override 
    public Loader<List<News>> onCreateLoader(int i, Bundle bundle) { 
     // Create a new loader for the given URL 
     return new NewsLoader(this, GUARDIAN_REQUEST_URL); 
    } 

    @Override 
    public void onLoadFinished(Loader<List<News>> loader, List<News> news) { 
     View loadingIndicator = findViewById(R.id.loading_indicator); 
     loadingIndicator.setVisibility(View.GONE); 

     mEmptyView.setText(R.string.no_news); 

     mAdapter.clear(); 

     if (news != null && !news.isEmpty()) { 
      mAdapter.addAll(news); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<List<News>> loader) { 
     // Loader reset, so we can clear out our existing data. 
     mAdapter.clear(); 
    } 
} 

J'ai déjà ajouté le android.support.v4.widget.SwipeRefreshLayout dans mon dossier activity_main.xml
Comment puis-je mettre en œuvre le SwipeRefreshLayout dans le code java?
Code pour aller chercher les données nouvelles:

package com.infinitystone.mani.news; 


import android.text.TextUtils; 
import android.util.Log; 

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

import java.io.BufferedReader; 
import java.io.IOException; 
import java.io.InputStream; 
import java.io.InputStreamReader; 
import java.net.HttpURLConnection; 
import java.net.MalformedURLException; 
import java.net.URL; 
import java.nio.charset.Charset; 
import java.util.ArrayList; 
import java.util.List; 

import static com.infinitystone.mani.news.MainActivity.LOG_TAG; 

public class QueryUtils { 


    private QueryUtils() { 

    } 

    public static List<News> fetchNewsData(String requestUrl) { 
     URL url = createUrl(requestUrl); 

     String jsonResponse = null; 
     try { 
      jsonResponse = makeHttpRequest(url); 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "Problem making the HTTP request.", e); 
     } 

     List<News> news = extractFeaturesFromJson(jsonResponse); 

     return news; 
    } 

    private static URL createUrl(String stringUrl) { 
     URL url = null; 
     try { 
      url = new URL(stringUrl); 
     } catch (MalformedURLException e) { 
      Log.e(LOG_TAG, "Problem building the URL ", e); 
     } 
     return url; 
    } 

    private static String makeHttpRequest(URL url) throws IOException { 
     String jsonResponse = ""; 

     // If the URL is null, then return early. 
     if (url == null) { 
      return jsonResponse; 
     } 

     HttpURLConnection urlConnection = null; 
     InputStream inputStream = null; 
     try { 
      urlConnection = (HttpURLConnection) url.openConnection(); 
      urlConnection.setReadTimeout(10000 /* milliseconds */); 
      urlConnection.setConnectTimeout(15000 /* milliseconds */); 
      urlConnection.setRequestMethod("GET"); 
      urlConnection.connect(); 

      // If the request was successful (response code 200), 
      // then read the input stream and parse the response. 
      if (urlConnection.getResponseCode() == 200) { 
       inputStream = urlConnection.getInputStream(); 
       jsonResponse = readFromStream(inputStream); 
      } else { 
       Log.e(LOG_TAG, "Error response code: " + urlConnection.getResponseCode()); 
      } 
     } catch (IOException e) { 
      Log.e(LOG_TAG, "Problem retrieving the earthquake JSON results.", e); 
     } finally { 
      if (urlConnection != null) { 
       urlConnection.disconnect(); 
      } 
      if (inputStream != null) { 
       // Closing the input stream could throw an IOException, which is why 
       // the makeHttpRequest(URL url) method signature specifies than an IOException 
       // could be thrown. 
       inputStream.close(); 
      } 
     } 
     return jsonResponse; 
    } 

    private static String readFromStream(InputStream inputStream) throws IOException { 
     StringBuilder output = new StringBuilder(); 
     if (inputStream != null) { 
      InputStreamReader inputStreamReader = new InputStreamReader(inputStream, Charset.forName("UTF-8")); 
      BufferedReader reader = new BufferedReader(inputStreamReader); 
      String line = reader.readLine(); 
      while (line != null) { 
       output.append(line); 
       line = reader.readLine(); 
      } 
     } 
     return output.toString(); 
    } 

    private static List<News> extractFeaturesFromJson(String newsJSON) { 

     if (TextUtils.isEmpty(newsJSON)) { 
      return null; 
     } 

     List<News> news = new ArrayList<>(); 

     try { 
      JSONObject rootObject = new JSONObject(newsJSON); 

      JSONObject responseObject = rootObject.getJSONObject("response"); 

      JSONArray resultsArray = responseObject.getJSONArray("results"); 

      for (int i = 0; i < resultsArray.length(); i++) { 
       JSONObject currentNews = resultsArray.getJSONObject(i); 

       String title = currentNews.getString("webTitle"); 

       String titleUrl = currentNews.getString("webUrl"); 

       String date = currentNews.getString("webPublicationDate"); 

       JSONObject fields = currentNews.getJSONObject("fields"); 

       String thumbnail = fields.getString("thumbnail"); 

       News news1 = new News(title, thumbnail, date, titleUrl); 

       news.add(news1); 
      } 
     } catch (JSONException e) { 
      Log.e("QueryUtils", "Problem parsing the earthquake JSON results", e); 
     } 

     return news; 
    } 
} 
+3

double possible de [Comment mettre en œuvre Android Pull-to-Refresh] (https://stackoverflow.com/questions/4583484/how-to-implement-android-pull-to-refresh) – akhilesh0707

+1

s'il vous plaît rechercher Google avant de poser une question comme ça –

+0

J'ai fait beaucoup de recherches sur google mais rien ne m'aide. Je suis une recrue – mani

Répondre

0

Essayez this Répondre au Gesture Refresh, il devrait aider.

+0

Cette réponse n'est pas très utile – mani

+1

cela devrait être un commentaire –

+0

@Nilesh désolé pas assez de réputation – Mukesh

0

as per my above comment utilisation SwipeRefreshLayout

Le SwipeRefreshLayout doit être utilisé chaque fois que l'utilisateur peut actualiser le contenu d'une vue par un geste de balayage vertical. L'activité qui instancie cette vue doit ajouter un OnRefreshListener pour être averti chaque fois que le mouvement de rafraîchissement est terminé. SwipeRefreshLayout notifiera l'auditeur à chaque fois que le geste est à nouveau terminé;

que défini setOnRefreshListener à votre SwipeRefreshLayout

void setOnRefreshListener (SwipeRefreshLayout.OnRefreshListener listener)

Réglez l'auditeur à être averti lorsqu'un rafraîchissement est déclenchée par le geste de balayage.

exemple de code

SwipeRefreshLayout mSwipeRefreshView; 
mSwipeRefreshView = (SwipeRefreshLayout) findViewById(R.id.homeScreenSwipeRefreshView); 

mSwipeRefreshView.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() { 
      @Override 
      public void onRefresh() { 

       // make your api request here 
      } 
     }); 

lorsque votre demande api complted que d'utiliser setRefreshing(false)

setRefreshing(boolean refreshing) 

Aviser le widget rafraîchir l'état a changé.

mSwipeRefreshView.setRefreshing(false);

+0

Comment puis-je faire la demande api dans le Méthode onRefresh()? – mani

+0

@mani où voulez-vous faire votre demande api –

+0

Il me donne une erreur de 'android.os.NetworkOnMainThreadException' – mani

0

obtenir une référence à votre balayez pour rafraîchir la mise en page.

private SwipeRefreshLayout swipeRefreshLayout; 

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

    swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh); 

    swipeRefreshLayout.setOnRefreshListener(this); 

    // ... your other codes... 

} 

Maintenant, faites que votre activité implémente l'écouteur.

public class MainActivity extends AppCompatActivity implements LoaderCallbacks<List<News>>, SwipeRefreshLayout.OnRefreshListener { 

    // ... 

} 

Enfin mettre en œuvre ces méthodes

@Override 
    public void onRefresh(){ 
    swipeRefreshLayout.setRefreshing(true); 

    newsList = fetchNewsData(GUARDIAN_REQUEST_URL); 
    mAdapter.notifyDataSetChanged(); 

    swipeRefreshLayout.setRefreshing(false); 

    } 

EDIT:

Voici le code complet pour MainActivity. S'il vous plaît utiliser ceci et laissez-moi savoir si cela fonctionne.

import android.app.LoaderManager; 
import android.app.LoaderManager.LoaderCallbacks; 
import android.content.Context; 
import android.content.Loader; 
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.net.ConnectivityManager; 
import android.net.NetworkInfo; 
import android.net.Uri; 
import android.os.Bundle; 
import android.support.customtabs.CustomTabsIntent; 
import android.support.v4.content.ContextCompat; 
import android.support.v4.widget.SwipeRefreshLayout; 
import android.support.v7.app.AppCompatActivity; 
import android.view.View; 
import android.widget.AdapterView; 
import android.widget.ListView; 
import android.widget.TextView; 

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

public class MainActivity extends AppCompatActivity implements LoaderCallbacks<List<News>>, SwipeRefreshLayout.OnRefreshListener { 

    public static final String LOG_TAG = MainActivity.class.getName(); 

    private static final int NEWS_LOADER_ID = 1; 

    private TextView mEmptyView; 

    private NewsAdapter mAdapter; 

    private static final String GUARDIAN_REQUEST_URL = "http://content.guardianapis.com/search?order-by=newest&show-fields=thumbnail&page-size=20&api-key=2f3badbb-4a58-44b8-9800-9ee2a0f445f9"; 

    private SwipeRefreshLayout swipeRefreshLayout; 
    @Override 
    protected void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 

     ListView newsList = (ListView) findViewById(R.id.list); 

     mEmptyView = (TextView) findViewById(R.id.empty_view); 
     newsList.setEmptyView(mEmptyView); 

     mAdapter = new NewsAdapter(this, new ArrayList<News>()); 
     newsList.setAdapter(mAdapter); 

     swipeRefreshLayout = (SwipeRefreshLayout) view.findViewById(R.id.refresh); 

     swipeRefreshLayout.setOnRefreshListener(this); 

     newsList.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
      @Override 
      public void onItemClick(AdapterView<?> parent, View view, int position, long id) { 
       News currentNews = mAdapter.getItem(position); 
       Uri uri = Uri.parse(currentNews.getUrl()); 

       CustomTabsIntent.Builder builder = new CustomTabsIntent.Builder(); 

       builder.setToolbarColor(ContextCompat.getColor(MainActivity.this, R.color.colorPrimary)); 
       builder.setSecondaryToolbarColor(ContextCompat.getColor(MainActivity.this, R.color.colorPrimaryDark)); 

       builder.setShowTitle(true); 

       final Bitmap backButton = BitmapFactory.decodeResource(getResources(), R.drawable.ic_arrow_back_white_24dp); 
       builder.setCloseButtonIcon(backButton); 

       CustomTabsIntent customTabsIntent = builder.build(); 
       customTabsIntent.launchUrl(MainActivity.this, uri); 

      } 
     }); 

     updateNewsList(); 


    } 

    private void updateNewsList(){ 
     ConnectivityManager connMgr = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); 

     NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); 

     if(networkInfo != null && networkInfo.isConnected()){ 
      LoaderManager loaderManager = getLoaderManager(); 

      loaderManager.initLoader(NEWS_LOADER_ID, null, this); 
     } 

     else { 
      View loadingIndicator = findViewById(R.id.loading_indicator); 
      loadingIndicator.setVisibility(View.GONE); 

      mEmptyView.setText(R.string.no_internet); 
     } 
    } 

    @Override 
    public Loader<List<News>> onCreateLoader(int i, Bundle bundle) { 
     // Create a new loader for the given URL 
     return new NewsLoader(this, GUARDIAN_REQUEST_URL); 
    } 

    @Override 
    public void onLoadFinished(Loader<List<News>> loader, List<News> news) { 
     View loadingIndicator = findViewById(R.id.loading_indicator); 
     loadingIndicator.setVisibility(View.GONE); 

     mEmptyView.setText(R.string.no_news); 

     mAdapter.clear(); 

     if (news != null && !news.isEmpty()) { 
      mAdapter.addAll(news); 
     } 
    } 

    @Override 
    public void onLoaderReset(Loader<List<News>> loader) { 
     // Loader reset, so we can clear out our existing data. 
     mAdapter.clear(); 
    } 


    @Override 
    public void onRefresh() { 
     swipeRefreshLayout.setRefreshing(true); 
     updateNewsList(); 
     swipeRefreshLayout.setRefreshing(false); 

    } 
} 
+0

Comment puis-je actualiser la liste des actualités dans la méthode 'refreshList();'? – mani

+0

Ne pas aider bro. – mani

+0

s'il vous plaît voir les derniers changements. –