2016-07-22 27 views
0

Ich muss eine dynamische Listenansicht implementieren. Ich habe es bereits mit Arrays und auf eine statische Weise erstellt, aber ich muss eine Schaltfläche hinzufügen, die neue Elemente im Raster erstellt und einen Klick auf Listner. Wenn ich von Arrays zu Listen umschalte, wird es eine Lösung sein? Hier ist mein Code, kann mir bitte jemand eine kleine Hilfe geben?dinamic füge Elemente auf der Listenansicht hinzu

GRID VIEW:

<GridView xmlns:android="http://schemas.android.com/apk/res/android" 
xmlns:tools="http://schemas.android.com/tools" 
android:layout_width="match_parent" 
android:layout_height="match_parent" 
android:horizontalSpacing="-10dp" 
tools:context="com.example.giovanni.mainapp_drawer.Activities.MainActivity" 
android:orientation="vertical" 
android:columnWidth="160dp" 
android:fadeScrollbars="true" 
android:gravity="center" 
android:numColumns="2" 
android:stretchMode="columnWidth" 
android:id="@+id/gv" 
</GridView> 

BUTTON-Adapter:

public class RoomsBtnAdapter extends BaseAdapter{ 


private Context context; 
private final String[] strings; 
private final int[] colors; 

public RoomsBtnAdapter(Context context, String[] strings, int[] colors) { 
    this.context = context; 
    this.strings = strings; 
    this.colors = colors; 
} 

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

    LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 

    View gridView; 

    if (convertView == null) { 

     gridView = new View(context); 

     gridView = inflater.inflate(R.layout.room_btn, null); 

     Button btn = (Button) gridView.findViewById(R.id.roomBtn); 
     btn.setText(strings[position]); 
     btn.setBackgroundResource(colors[position]); 

    } else { 
     gridView = (View) convertView; 
    } 

    return gridView; 
} 

@Override 
public int getCount() { 
    return strings.length; 
} 

@Override 
public Object getItem(int position) { 
    return null; 
} 

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

}

Fragment of grid Ansicht:

public class RoomsFragment extends Fragment { 

public int[] colors = {R.color.colorRoom1, R.color.colorRoom2, R.color.colorRoom3, R.color.colorRoom4, R.color.colorRoom5, R.color.colorRoom6, R.color.colorRoom7}; 

public String[] strings = {"Conversare", "Giocare (videogames)", "Break", "Business", "Compagni di viaggio", "Aperitivo", "Chiacchiere e caffè"}; 

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

@Override 
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { 
    return inflater.inflate(R.layout.fragment_rooms, container, false); 
} 


@Override 
public void onViewCreated(View view, Bundle savedInstanceState) { 

    final GridView gridView = (GridView) getActivity().findViewById(R.id.gv); 
    gridView.setAdapter(new RoomsBtnAdapter(getContext(), strings, colors)); 

    gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
     @Override 
     public void onItemClick(AdapterView<?> parent, View view, 
           int position, long id) { 

      switch (position) { 
       case 0: 
        Log.d("click", "click"); 

       case 1: 
      } 

     } 
    }); 
} 

}

Antwort

0

Sie haben es sehr gut gemacht! Und ja, es gibt eine Lösung. Die Schlüsselmethode ist adapter.notifyDataSetChanged(); Wenn Sie diesen notifyDataSetChanged aufrufen, versucht der Adapter, das ListView neu zu zeichnen. Wenn Sie also Änderungen an der Datenquelle vornehmen (In diesem Fall fügen Sie der Liste ein Element hinzu), sehen Sie eine andere Anzahl von Zellen.

So müssen Sie die folgenden Schritte ausführen:

1- Ersetzen der String [] für eine Liste

2- einen Verweis auf das erstellte Adapter Halten

3- Rufen Sie an diesem Adapter notifyDataSetChanged() auf, wenn Sie eine Änderung vornehmen (Diese Methode sollte im UI-Thread aufgerufen werden)

Der endgültige Code sollte in etwa so aussehen:

final GridView gridView = (GridView) getActivity().findViewById(R.id.gv); 
final RoomsBtnAdapter adapter = new RoomsBtnAdapter(getContext(), strings, colors); 
gridView.setAdapter(adapter); 

gridView.setOnItemClickListener(new AdapterView.OnItemClickListener() { 
    @Override 
    public void onItemClick(AdapterView<?> parent, View view, 
          int position, long id) { 

     switch (position) { 
      case 0: 
       strings.add("New String"); 
       adapter.notifyDataSetChanged(); //This is the key ingredient 
      case 1: 
     } 

    } 
});