Come visualizzare ArrayList oggetti in GridView in Android nel frammento

voti
1

Sto cercando di imparare come visualizzare un GridView con 3 colonne in un frammento. I valori sono dal file strings.xml come una lista di array. Quando eseguo l'applicazione si blocca. Qualcuno mi può aiutare per visualizzare i valori in 3 colonne e cioè Luoghi, Descrizione e Time. Posso `t procedere su come visualizzare i valori letti in GridView.

My Code are as follows:
**Strings.XML**
    <string-array name=PlacesName>
        <item>Durban</item>
        <item>Paris</item>
        <item>HongKong</item>
        <item>Canada</item>
    </string-array>

    <string-array name=Description>
        <item>Description1</item>
        <item>Description2</item>
        <item>Description3</item>
    </string-array>

    <string-array name=ScheduleDate>
        <item>12/1/2015</item>
        <item>13/2/2015</item>
        <item>14/4/2015</item>
        <item>15/5/2015</item>
    </string-array>

**Fragment**

    */
public class FlightFragment extends Fragment {

    GridView grid;

    public FlightFragment() {
        // Required empty public constructor
    }


    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_flight, container, false);
        // Inflate the layout for this fragment
        grid = (GridView) view.findViewById(R.id.gridView);
        MyAdapter myAdapter = new MyAdapter();
        grid.setAdapter(myAdapter);
        return view;

    }

    class MyAdapter extends BaseAdapter {

        ArrayList<Schedule> list;
        private Context context;

        MyAdapter() {
            list = new ArrayList();
            Resources resources = context.getResources();
            String[] tempPlaces = resources.getStringArray(R.array.PlacesName);
            String[] tempDate = resources.getStringArray(R.array.ScheduleDate);
            String[] tempDescription = resources.getStringArray(R.array.Description);
            for(int count=0;count<4;count++ ){
                Schedule tempSchedule = new Schedule(tempPlaces[count],tempDate[count],tempDescription[count]);
                list.add(tempSchedule);
            }
        }
        @Override
        public int getCount() {
            return list.size();
        }

        @Override
        public Object getItem(int position) {
            return list.get(position);
        }

        @Override
        public long getItemId(int position) {
            return position;
        }

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            Schedule tempSchedule = list.get(position);
            TextView textView;
            if (convertView == null){
                textView = new TextView(context);
                textView.setLayoutParams(new GridView.LayoutParams(85, 85));
                textView.setPadding(8, 8, 8, 8);
            }
            else{
                textView = (TextView) convertView;
            }
            textView.setText(tempSchedule.Place);
            return textView;
        }
    }

    class Schedule {
        String Place;
        String ScheduleTime;
        String Description;

        Schedule(String place, String scheduleTime, String description ) {
            this.Description = description;
            this.Place = place;
            this.ScheduleTime = scheduleTime;
        }
    }
}

Errore

Eccezione irreversibile: java.lang.NullPointerException principale a android.support.v4.app.Fragment com.ts.FlightFragment $ MyAdapter (FlightFragment.java:51) a com.ts.FlightFragment.onCreateView (FlightFragment.java:38). .performCreateView (Fragment.java:1786) a android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:947) a android.support.v4.app.FragmentManagerImpl.moveToState (FragmentManager.java:1126) a Android. support.v4.app.BackStackRecord.run (BackStackRecord.java:739) a android.support.v4.app.FragmentManagerImpl.execPendingActions (FragmentManager.java:1489) a android.support.v4.app.FragmentManagerImpl $ 1.run (FragmentManager .java: 454) a android.os.Handler.handleCallback (Handler.java:725) a android.os.Handler.dispatchMessage (Handler.java:92) a android.os.Looper.loop (Looper.java:176) a android.app.ActivityThread.main (ActivityThread.java:5279) a Java. lang.reflect.Method.invokeNative (Native Method) a java.lang.reflect.Method.invoke (Method.java:511) a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1102) a com.android.internal.os.ZygoteInit.main (ZygoteInit.java:869) a dalvik.system.NativeStart.main (metodo natale)lang.reflect.Method.invoke (Method.java:511) a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1102) a com.android.internal.os.ZygoteInit.main (ZygoteInit. java: 869) a dalvik.system.NativeStart.main (metodo natale)lang.reflect.Method.invoke (Method.java:511) a com.android.internal.os.ZygoteInit $ MethodAndArgsCaller.run (ZygoteInit.java:1102) a com.android.internal.os.ZygoteInit.main (ZygoteInit. java: 869) a dalvik.system.NativeStart.main (metodo natale)

È pubblicato 11/03/2015 alle 05:26
dall'utente
In altre lingue...                            


2 risposte

voti
0

Problema

contesto in MyAdapter è nullo

Soluzione:-

Passare contesto al costruttore MyAdapter in questo modo: -

MyAdapter myAdapter = new MyAdapter(getActivity());

E cambiare questo in classe MyAdapter

MyAdapter(Context context) {
this.context=context;
......
}
Risposto il 11/03/2015 a 05:49
fonte dall'utente

voti
0

Il problema è che si è dimenticato di assegnare contesto nel vostro adattatore. È possibile passare tramite il costruttore. In attività, si può semplicemente utilizzare thiscome contesto. Nel tuo caso, nel frammento, bisogno di passare getActivity()da un contesto.

public class FlightFragment extends Fragment {

GridView grid;

public FlightFragment() {
    // Required empty public constructor
}


@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container,
                         Bundle savedInstanceState) {
    View view = inflater.inflate(R.layout.fragment_flight, container, false);
    // Inflate the layout for this fragment
    grid = (GridView) view.findViewById(R.id.gridView);
    MyAdapter myAdapter = new MyAdapter(getActivity());
    grid.setAdapter(myAdapter);
    return view;

}

class MyAdapter extends BaseAdapter {

    ArrayList<Schedule> list;
    private Context context;

    MyAdapter(Context context) {
        this.context = context;
        list = new ArrayList();
        Resources resources = context.getResources();
        String[] tempPlaces = resources.getStringArray(R.array.PlacesName);
        String[] tempDate = resources.getStringArray(R.array.ScheduleDate);
        String[] tempDescription = resources.getStringArray(R.array.Description);
        for(int count=0;count<4;count++ ){
            Schedule tempSchedule = new Schedule(tempPlaces[count],tempDate[count],tempDescription[count]);
            list.add(tempSchedule);
        }
    }
    @Override
    public int getCount() {
        return list.size();
    }

    @Override
    public Object getItem(int position) {
        return list.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Schedule tempSchedule = list.get(position);
        if (convertView == null){
            convertView = LayoutInflater.from(context).inflate(R.layout.grid_row, parent, false);
        }
        TextView placeName = (TextView) convertView.findViewById(R.id.place_name);
        TextView scheduleDate = (TextView) convertView.findViewById(R.id.schedule_date);
        TextView description = (TextView) convertView.findViewById(R.id.description);
        placeName.setText(tempSchedule.Place);
        scheduleDate.setText(tempSchedule.ScheduleTime);
        description.setText(tempSchedule.Description);
        return convertView;
    }
}

in grid_row.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical">
    <TextView
        android:id="@+id/place_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/schedule_date"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/description"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"/>
</LinearLayout>

Modifica È necessario creare grid_row.xmlche è compreso 3 textviews. Gonfiare il layout su getViewe poi restituirlo. È possibile migliorare le prestazioni per evitare findViewById()utilizzando ViewHolder modello .

Risposto il 11/03/2015 a 05:51
fonte dall'utente

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more