Autore Topic: Visualizzare gli elementi di un Json in una View personalizzata  (Letto 627 volte)

Offline konan_ 65

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
  • Sistema operativo:
    Windows 8.1
Visualizzare gli elementi di un Json in una View personalizzata
« il: 21 Maggio 2015, 17:31:59 CEST »
0
Ciao a tutti, come da titolo ho dei problemi nel visualizzare un Json all'interno di una View personalizzata.

L'app funziona in questo modo, per prima cosa creo una classe in cui inserire i dati del Json, dopo di che scarico in Json e inserisco in una ListView dell'Activity principale una View tramite un Personal Adapter.

Questo è il codice con cui scarico il Json

Codice (Java): [Seleziona]
public class Table extends Activity {

    TableAdapter adpt;

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

        ListView lv = (ListView) findViewById(R.id.listView);

        adpt = new TableAdapter(this, new ArrayList<Data>());

        lv.setAdapter(adpt);
        (new AsyncListViewLoader()).execute("http://tc.api.officinacomunica.it/api.svc/it/catalogs");
    }

    private class AsyncListViewLoader extends AsyncTask<String, Void, List<Data>> {
        private final ProgressDialog dialog = new ProgressDialog(Table.this);

        @Override
        protected void onPostExecute(List<Data> result) {
            super.onPostExecute(result);
            dialog.dismiss();
            adpt.setItemList(result);
            adpt.notifyDataSetChanged();
        }

        @Override
        protected void onPreExecute() {
            super.onPreExecute();
            dialog.setMessage("Downloading data...");
            dialog.show();
        }

        @Override
        protected List<Data> doInBackground(String... params) {
            List<Data> result = new ArrayList<Data>();

            try {
                URL u = new URL(params[0]);

                HttpURLConnection conn = (HttpURLConnection) u.openConnection();
                conn.setRequestMethod("GET");

                conn.connect();
                InputStream is = conn.getInputStream();

                // Read the stream
                byte[] b = new byte[1024];
                ByteArrayOutputStream baos = new ByteArrayOutputStream();

                while ( is.read(b) != -1)
                    baos.write(b);

                String JSONResp = new String(baos.toByteArray());

                JSONArray arr = new JSONArray(JSONResp);
                for (int i=0; i < arr.length(); i++) {
                    result.add(convertData(arr.getJSONObject(i)));
                }

                return result;
            }
            catch (Throwable t) {
                t.printStackTrace();
            }
            return null;
        }

        private Data convertData(JSONObject obj) throws JSONException {
            String name = obj.getString("name");
            String description = obj.getString("description");
            String size = obj.getString("size");
            String page = obj.getString("page");
            String image = obj.getString("image_url");

            return new Data(name, description, image);
        }

    }

}


Questo quello del Personal Adapter
Codice (Java): [Seleziona]
public class TableAdapter extends ArrayAdapter<Data>{

    private List<Data> dataList;
    private Context ctx;

    public TableAdapter(Context ctx, List<Data> dataList){
        super(ctx, R.layout.table_layout, dataList);
        this.ctx = ctx;
        this.dataList = dataList;
    }

    public int getCount() {
        if (dataList != null)
            return dataList.size();
        return 0;
    }

    public Data getItem(int position) {
        if (dataList != null)
            return dataList.get(position);
        return null;
    }

    public long getItemId(int position) {
        if (dataList != null)
            return dataList.get(position).hashCode();
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent){

        DataHolder holder = new DataHolder();

        if(convertView == null){
            convertView = LayoutInflater.from(ctx).inflate(R.layout.table_layout, parent, false);

            TextView name = (TextView) convertView.findViewById(R.id.name);
            TextView description = (TextView) convertView.findViewById(R.id.description);
            TextView size = (TextView) convertView.findViewById(R.id.size);
            TextView page = (TextView) convertView.findViewById(R.id.page);
            ImageButton img = (ImageButton) convertView.findViewById(R.id.imageButton);

            holder.nameView = name;
            holder.descriptionView = description;
            holder.sizeView = size;
            holder.pageView = page;
            holder.imageView = img;

            convertView.setTag(holder);
        }else{
            holder = (DataHolder) convertView.getTag();
        }

        Data d = getItem(position);

        holder.nameView.setText(d.getName());
        holder.descriptionView.setText(d.getDescription());
        holder.sizeView.setText(d.getSize());
        holder.pageView.setText(d.getPage());
        holder.imageView.setImageBitmap(downloadBitmap(d.getImg()));

        return convertView;
    }

    public List<Data> getItemList() {
        return dataList;
    }

    public void setItemList(List<Data> dataList) {
        this.dataList = dataList;
    }

    private static class DataHolder{
        public TextView nameView;
        public TextView descriptionView;
        public TextView sizeView;
        public TextView pageView;
        public ImageButton imageView;
    }

    private Bitmap downloadBitmap(String fileUrl)
    {
        InputStream is = null;
        try
        {
            HttpURLConnection conn = (HttpURLConnection) new URL(fileUrl).openConnection();
            conn.connect();
            is = conn.getInputStream();

            return BitmapFactory.decodeStream(is);
        }
        catch (MalformedURLException e)
        {
        }
        catch (IOException e)
        {
        }
        finally
        {
            if (is != null)
                try
                {
                    is.close();
                }
                catch (IOException e)
                {
                }
        }
        return null;
    }


}

e questo è il laytou personalizzato

Codice (XML): [Seleziona]
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
   android:layout_width="match_parent" android:layout_height="match_parent">

    <LinearLayout
       android:orientation="horizontal"
       android:layout_width="match_parent"
       android:layout_height="match_parent"
       android:weightSum="1">

        <ImageButton
           android:layout_width="90dp"
           android:layout_height="122dp"
           android:id="@+id/imageButton" />

        <LinearLayout
           android:orientation="vertical"
           android:layout_width="match_parent"
           android:layout_height="138dp"
           android:weightSum="1">

            <TextView
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:textAppearance="?android:attr/textAppearanceLarge"
               android:text="@string/name"
               android:id="@+id/name" />

            <TextView
               android:layout_width="match_parent"
               android:layout_height="0dp"
               android:textAppearance="?android:attr/textAppearanceLarge"
               android:text="@string/description"
               android:id="@+id/description"
               android:layout_weight="0.62" />

            <LinearLayout
               android:orientation="horizontal"
               android:layout_width="match_parent"
               android:layout_height="wrap_content"
               android:weightSum="1">

                <TextView
                   android:layout_width="85dp"
                   android:layout_height="wrap_content"
                   android:textAppearance="?android:attr/textAppearanceLarge"
                   android:text="@string/size"
                   android:id="@+id/size" />

                <TextView
                   android:layout_width="85dp"
                   android:layout_height="wrap_content"
                   android:textAppearance="?android:attr/textAppearanceLarge"
                   android:text="@string/page"
                   android:id="@+id/page" />

                <Button
                   android:layout_width="wrap_content"
                   android:layout_height="wrap_content"
                   android:text="@string/download"
                   android:id="@+id/button" />
            </LinearLayout>
        </LinearLayout>

    </LinearLayout>
</RelativeLayout>

Ovviamente ho dato i permessi nel manifest per accedere a internet, ma, quando apro l'app non mi visualizza nulla

Offline konan_ 65

  • Nuovo arrivato
  • *
  • Post: 18
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus 5
  • Sistema operativo:
    Windows 8.1
Re:Visualizzare gli elementi di un Json in una View personalizzata
« Risposta #1 il: 28 Maggio 2015, 17:25:55 CEST »
0
nessuno riesce ad aiutarmi?

Offline tonno16

  • Utente storico
  • *****
  • Post: 1228
  • Respect: +59
    • Mostra profilo
  • Dispositivo Android:
    moto g
  • Play Store ID:
    Diego Tonini
  • Sistema operativo:
    OpenSuse
Re:Visualizzare gli elementi di un Json in una View personalizzata
« Risposta #2 il: 28 Maggio 2015, 22:46:21 CEST »
0
Cosa vuol dire? Hai log? Prova fare il log della richiesta e vedere se hai ricavato bene i dati?

I miei consigli sono:
Crea una lista vuota. Setta il tuo adapter mettendo la lista. Ora la listview sarà vuota ovviamente.
USA una libreria tipo asynk http per fare le richieste con URL. È sicuramente meglio rispetto a creare un asynk custom che gestisce un array di byte.
Usa anche la libreria gson.

Gson più asynk http è una coppia vincente. In 4 righe riesci a fare la richiesta http, scaricare json. È con gson riesci a serializzare i dati ottenuti direttamente nei tuoi oggetti Data.

Ovviamente devi leggeri un minimo di documentazione. Per asynkhttp questa operazione richiede massimo 4 minuti per avere un idea sul suo funzionamento