view

Mattepuffo's logo
Ordinare una ListView in Android

Ordinare una ListView in Android

Abbiamo visto come riempire una ListView in Android usando dati in formato JSON.

Solo che la lista risulta "statica" nel senso che come ci arriva la leggiamo, e non possiamo ordinarla.

Qui vediamo proprio questo: come ordinare una ListView simulando una tabella con righe e colonne.

Partiamo dalla Activity principale:

public class MainActivity extends Activity {
    
    private TextView txtTitolo = null;
    private TextView txtCreazione = null;
    private ListView listView = null;
    private SimpleAdapter adapter = null;
    private ArrayList> list = new ArrayList>();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setLista();
        txtTitolo = (TextView) findViewById(R.id.h_titolo);
        txtCreazione = (TextView) findViewById(R.id.h_creazione);
        txtTitolo.setOnClickListener(new ListSort(list, "titolo", adapter));
        txtCreazione.setOnClickListener(new ListSort(list, "creazione", adapter));
    }
    
    private void setLista() {
        try {
            listView = (ListView) findViewById(R.id.lista_articoli);
            JSONArray jsonArray = new JSONArray(JsonFile.read(path + "blog_articoli.json"));
            for (int i = 0; i < jsonArray.length(); i++) {
                JSONObject jo = jsonArray.getJSONObject(i);
                HashMap map = new HashMap();
                map.put("id", jo.getString("id"));
                map.put("titolo", jo.getString("titolo"));
                map.put("creazione", jo.getString("creazione"));
                map.put("modifica", jo.getString("modifica"));
                map.put("count", jo.getString("count"));
                list.add(map);
            }
            adapter = new SimpleAdapter(this, list, R.layout.rows,
                    new String[] { "titolo", "creazione", "modifica", "count" },
                    new int[] { R.id.titolo, R.id.creazione, R.id.modifica, R.id.count });
            listView.setAdapter(adapter);
        } catch (JSONException e) {
        } catch (Exception e) {
        }
    }

}

Tralascio tutta la parte del recupero dati, partendo che l'abbiate già messa a punto (quella parte non cambia).

Mattepuffo's logo
Svuotare un form in JSF

Svuotare un form in JSF

Ultimamente mi sono dato allo studio del framework JSF (Java Server Faces).

Un arogmento molto richiesto è come svuotare un form dopo che è stato inviato (e magari anche validato) senza usare redirect o Javascript.

Perchè il fatto è che il comportamento di default prevede che il form non si svuoti se si rimane nella stessa pagina.

Vediamo quindi come fare; prima di tutto abbiamo un form del genere:

      <h:form id="frm_add_lavoro">
            <h:inputText value="#{lb.titolo}" id="titolo">
            </h:inputText><br/>
            <h:inputTextarea value="#{lb.testo}" id="testo">
            </h:inputTextarea>
            <h:commandButton action="#{lb.addLavoro()}" value="Aggiungi lavoro" />
        </h:form>

La cosa importante è specificare un id al form e un id per ogni componente che ci interessa, in modo da poterli richiamare nel nostro ManagedBean.       

Mattepuffo's logo
Android WebView offline

Android WebView offline

Tempo fa abbiamo parlato delle Webview in Android; questo componente permette di visualizzare pagine web dentro le nostre app.

Basandosi su Webkit, le WebView hanno un ottimo supporto ad HTML 5.

L'unico svantaggio è che se il device è offline non è possibile visualizzare le pagine.

Possiamo però impostarle per tenere le pagine anche offline in cache.

Cosa finadamentale è che la pagine web non sia impostata per non permettere la cache con impostazioni di questo tipo:

Cache-control: no-store, no-cache
Pragma: no-cache

Una volta verificato ciò, passiamo alla app.

Prima di tutto verifichiamo che il device sia connesso:

public class CheckConn {

    public static boolean isNetworkAvailable(Context context) {
        ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo ni = cm.getActiveNetworkInfo();
        if (ni == null) {
            return false;
        }
        return ni.isConnected();
    }

}

Ho già parlato anche di questo, quindi non mi soffermo a spiegare.

Mattepuffo's logo
Usare i Toast in Android

Usare i Toast in Android

I Toast sono dei semplici avvisi mostrati all'utente.

Non hanno un'interazione diretta con l'utente, ma spariscono dopo un certo lasso di tempo.

Molto utili per brevi messaggi; io li uso inviare messaggi quando intercetto una eccezione.

Qui trovate la doc ufficiale; il metodo più interessante è makeText, che due versioni, di cui noi useremo quella che prevede l'impostazione del messaggio.

Vediamo qualche semplice esempio.

Toast t = Toast.makeText(getApplicationContext(), "Il file non esiste", Toast.LENGTH_SHORT);
t.show();

Il parametro è il Context; potrebbe andar bene anche un this.

Il secondo parametro il messaggio da visualizzare, e il terzo la durata (in questo caso uno degli standard di Android).

Mattepuffo's logo
Android ListView da JSON

Android ListView da JSON

In un precedente articolo vi avevo mostrato come riempire uno Spinner in Android prendendo i dati in remoto in formato JSON.

Oggi vedremo come fare la stessa operazione con una ListView, che però inseriremo in un Fragment.

La base di partenza per i Fragment dentro a un Tab la potete trovare qua.

Adesso andremo a riempire il nostro Fragment con una ListView.

Prima però andiamo a prendere la classe Service per il recupero dei dati:

public class Service {

    private final String remote = "http://www.example.com/";
    
    public String login(String user, String pwd) throws ClientProtocolException, IOException {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(remote + "login.php");
        List nameValuePairs = new ArrayList(2);
        nameValuePairs.add(new BasicNameValuePair("user", user));
        nameValuePairs.add(new BasicNameValuePair("pwd", pwd));
        post.setEntity(new UrlEncodedFormEntity(nameValuePairs));
        HttpResponse response = client.execute(post);
        BufferedReader reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
        String line;
        String result = null;
        while ((line = reader.readLine()) != null) {
            result = line;
        }
        reader.close();
        return result;
    }
    
    public String getLastItems(String phpFile) throws ClientProtocolException, IOException, JSONException {
        HttpClient client = new DefaultHttpClient();
        HttpPost post = new HttpPost(remote + phpFile);
        HttpResponse response = client.execute(post);
        HttpEntity entity = response.getEntity();
        BufferedReader reader = new BufferedReader(new InputStreamReader(entity.getContent(), "UTF-8"));
        StringBuilder sb = new StringBuilder();
        String line = null;
        while ((line = reader.readLine()) != null) {
            sb.append(line).append("\n");
        }
        reader.close();
        return sb.toString();
    }

}

Questo è il metodo che ci servirà nel Fragment, metodo a simile a quello spiegato in altri articoli, quindi non mi ci soffermo.

Mattepuffo's logo
Usare i Tab e i Fragment in Android

Usare i Tab e i Fragment in Android

Nelle ultime versioni delle API, Google ci ha messo a disposizione i layout a tab, cosa che semplifica di molto la creazione di un layout, appunto, con i tab (che prima si doveva fare a mano).

Vediamo come usare questo tipo di layout con i Fragment.

Cominciamo con il layout che imposteremo nella Activity:

<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context=".BancaActivity"
    tools:ignore="MergeRootFrame" >

    <fragment
        android:id="@+id/entries_fragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginTop="?android:attr/actionBarSize"
        class="com.mp.banca.EntriesFragment" >
    </fragment>

    <fragment
        android:id="@+id/releases_fragment"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_marginTop="?android:attr/actionBarSize"
        class="com.mp.banca.ReleasesFragment" >
    </fragment>

</FrameLayout>

Come vedete ci sono due elementi Fragment, che puntano a due specifiche classi.