2016-07-22 2 views
0

Мне нужно реализовать динамическое представление списка. Я уже создал его с массивами и статическим способом, но мне нужно добавить кнопку, которая создает новые элементы в сетке и щелчок на списке. Если я переключусь с массивов на списки, это будет решение? Вот мой код, может ли кто-нибудь мне немного помочь?динамические элементы добавления в виде списка

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> 

КНОПКА 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; 
} 

}

Фрагмент табличном:

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: 
      } 

     } 
    }); 
} 

}

ответ

0

Вы сделали это очень хорошо! И да, есть решение. Ключевым методом является adapter.notifyDataSetChanged(); если вы вызываете этот notifyDataSetChanged, адаптер попытается «перерисовать» ListView, поэтому, если вы внесете какие-либо изменения в источник данных (в этом случае вы добавите элемент в список), вы увидите другое количество ячеек.

Так что вам нужно выполнить следующие действия:

1- Заменить String [] для списка

2- Держите ссылку на адаптер, созданный

3- Вызовите notifyDataSetChanged() на этом адаптере каждый раз, когда вы делаете изменения (этот метод следует вызывать в потоке пользовательского интерфейса)

Окончательный код должен выглядеть примерно так:

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: 
     } 

    } 
}); 
Смежные вопросы