Autore Topic: ListFragment e CustomAdapter  (Letto 619 volte)

Offline Fenicexx

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
ListFragment e CustomAdapter
« il: 18 Marzo 2014, 17:02:23 CET »
0
Salve,
come punto di partenza ho usato questo tutorial http://www.anddev.it/index.php?topic=8952.0 e il tutto funziona correttamente. Adesso ho necessità di creare una lista con immagine e testo per il menu iniziale, e cliccando su un item del menu deve aprire un'altra listfragment che prende questa volta i valori da un json.

Questo tipo di lavoro lo avevo già fatto con le listActivity, vorrei adesso usare le listfragment, ma sto facendo fatica ad andare avanti.

Avreste qualche link, tutorial, idea per andare avanti?

Grazie
« Ultima modifica: 27 Marzo 2014, 18:04:54 CET da Fenicexx »

Offline Fenicexx

  • Nuovo arrivato
  • *
  • Post: 25
  • Respect: 0
    • Mostra profilo
Re:ListFragment e CustomAdapter
« Risposta #1 il: 27 Marzo 2014, 18:14:34 CET »
0
Sempre sulla base del tutorial ho provato a fare delle modifiche e questo il logcat una volta avviata l'app:
Codice: [Seleziona]
03-27 18:01:03.543: E/AndroidRuntime(29685): FATAL EXCEPTION: main
03-27 18:01:03.543: E/AndroidRuntime(29685): java.lang.RuntimeException: Unable to start activity ComponentInfo{it.esempio.iwond/it.esempio.iwond.CatalogActivity}: java.lang.NullPointerException
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2110)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2135)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.ActivityThread.access$700(ActivityThread.java:140)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1237)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.os.Handler.dispatchMessage(Handler.java:99)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.os.Looper.loop(Looper.java:137)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.ActivityThread.main(ActivityThread.java:4921)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at java.lang.reflect.Method.invokeNative(Native Method)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at java.lang.reflect.Method.invoke(Method.java:511)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1027)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:794)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at dalvik.system.NativeStart.main(Native Method)
03-27 18:01:03.543: E/AndroidRuntime(29685): Caused by: java.lang.NullPointerException
03-27 18:01:03.543: E/AndroidRuntime(29685):         at it.esempio.iwond.MyListFrag_catalog.onActivityCreated(MyListFrag_catalog.java:108)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.support.v4.app.Fragment.performActivityCreated(Fragment.java:1508)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:947)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1104)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.support.v4.app.FragmentManagerImpl.moveToState(FragmentManager.java:1086)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.support.v4.app.FragmentManagerImpl.dispatchActivityCreated(FragmentManager.java:1884)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.support.v4.app.FragmentActivity.onStart(FragmentActivity.java:566)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.Instrumentation.callActivityOnStart(Instrumentation.java:1178)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.Activity.performStart(Activity.java:5216)
03-27 18:01:03.543: E/AndroidRuntime(29685):         at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2083)
03-27 18:01:03.543: E/AndroidRuntime(29685):         ... 11 more

La classe che estende ListFragment:

Codice: [Seleziona]
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.support.v4.app.ListFragment;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
import android.widget.Toast;

/**
 * Fragment che si occupa della visualizzazione di una lista di String.
 *
 *
 */
public class MyListFrag_catalog extends ListFragment {

                        /*modifica*/
                        ListView lv1;
                        CatalogAdapter adapter;
                       
                        //le righe effettive della lista!
                        ArrayList<Menu> righe;
                        /**/
       
   
       
                /**
         * Interfaccia di Callback per comunicare con l'activity che contiene il Fragment.
         */
        public static interface OnMyListFragmentItemClick {
                public void onClick(String item);
        }
       
        /**
         * Riferimento all'activity di Callback.
         */
        private OnMyListFragmentItemClick mActivityAttached;
       
        /**
         * Oggetti della lista da visualizzare.
         */
        //private final String[] mObjectArray = new String[] {"Item1", "Item2", "Item3", "Item4", "Item5"};
       
        @Override
        public void onAttach(Activity activity) {
                super.onAttach(activity);
               
                if(activity instanceof OnMyListFragmentItemClick) {
                        // L'activity che contiene il fragment è compatibile con l'interfaccia di Callback, mi memorizzo il riferimento.
                        mActivityAttached = (OnMyListFragmentItemClick)activity;
                }
                else {
                        // L'activity non è compatibile, creo un riferimento fittizzio.
                        mActivityAttached = new OnMyListFragmentItemClick() {
                                public void onClick(String item) {}
                        };
                }
        }
       
        @Override
        public void onActivityCreated(Bundle savedInstanceState) {
                super.onActivityCreated(savedInstanceState);
             
                //setListAdapter(new ArrayAdapter<String>(getActivity(), android.R.layout.simple_list_item_1, mObjectArray));
               
                righe = new ArrayList<Menu>();
                       
                        //prendo il riferimento alla lista
                       
                lv1 = (ListView)  getListView().findViewById(R.id.menuListView);
                       
                       
                        String Catalog = getString(R.string.catalog);
                            String News = getString(R.string.news);
                            String Contacts = getString(R.string.contacts);
                            String Company = getString(R.string.company);
                           
                       
                        Menu[] mObjectArray = {

                                        new Menu(Catalog, R.drawable.catalogo),
                                        new Menu(News, R.drawable.news),
                                        new Menu(Contacts, R.drawable.contatti),
                                        new Menu(Company, R.drawable.azienda)} ;
       
       
                        for(int i=0; i <4; i++){

                                righe.add(mObjectArray[i]);
                       
                        }

                       
                        //creo l'adapter e lo passo alla listview
                       
                       
                        //lv1.setAdapter(adapter);
                       
                       
                        //adapter = new CatalogAdapter(this, righe);
                       
                        lv1.setAdapter(adapter);
                       
                       
                        //PER REFRESH DATI:adapter.notifyDataSetChanged();
               
        }

}

E questo è l'adapter:
Codice: [Seleziona]
public class CatalogAdapter extends BaseAdapter{
       
        private Context mContext;
    private LayoutInflater mInflater;
    private List<Menu> picList = null;
    private ArrayList<Menu> listpicOrigin;
       
       
       
        public CatalogAdapter(Context context, List<Menu> riga) {
               
               
                         mContext = context;
                this.picList = riga;
                mInflater = LayoutInflater.from(mContext);
                this.listpicOrigin = new ArrayList<Menu>();
                this.listpicOrigin.addAll(picList);
               
               
               
        }
       
       
        //per comodità rappresenta la singola riga
           public class ViewHolder {
                TextView nome;
                ImageView immagine;
                //TextView descrizione;
            }
       
       
           
           //ritorna il tipo di riga, ed è usato per scegliere il layout giusto nel metodo getview
          /*
           @Override
       public int getItemViewType(int position) {
           return picList.get(position).getTipo_riga();
       }*/ 
           
       
         //quanti tipi di righe ci sono? 1, 2 ecc...in questo esempio 2.   
        @Override
        public int getViewTypeCount() {
                // TODO Auto-generated method stub
                return 2;
       
       
        }
       
       
        //ottiene il totale delle righe della lista
        @Override
        public int getCount() {
                // TODO Auto-generated method stub
                return picList.size();
        }

       
        //ottiene il singolo oggetto della lista
        @Override
        public Object getItem(int position) {
                // TODO Auto-generated method stub
                   return picList.get(position);
        }

       
        //ottiene la posizione della lista
        @Override
        public long getItemId(int position) {
                // TODO Auto-generated method stub
                return position;
        }

       
        //METODO PRINCIPALE!!!!!!
        @Override
        public View getView(int position, View view, ViewGroup parent) {
                // TODO Auto-generated method stub
               
                //prendo il tipo di riga...in base al tipo caricherò ovviamente il differente layout
                int type = getItemViewType(position);
               
                 final ViewHolder holder;
                if (view == null) {
                    holder = new ViewHolder();
                   
                   
                    view = mInflater.inflate(R.layout.row, null);
               
                   
                   
                    holder.nome = (TextView)view.findViewById(R.id.menuName);
                holder.immagine = (ImageView) view.findViewById(R.id.menuImage);
                   
                    view.setTag(holder);
                } else {
                    holder = (ViewHolder) view.getTag();
                }
         
               
               
               
                //POPOLO I DATI NELLA RIGA
               
                holder.nome.setText(picList.get(position).getName());
                holder.immagine.setImageResource(picList.get(position).getImage());
                //holder.descrizione.setText(picList.get(position).getDescrizione());
               
               
                return view;
        }

}

Spero qualcuno possa essermi d' aiuto.

Grazie