在列表视图上动态添加元素

时间:2016-07-22 19:23:14

标签: android list button android-gridview

我需要实现动态列表视图。 我已经用数组和静态方式创建了它,但我需要添加一个按钮,在网格中创建新元素并单击listner。 如果我从数组切换到列表,它将是一个解决方案? 这是我的代码,有人可以给我一些帮助吗?

网格视图:

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

}

网格视图的片段:

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

            }
        });
    }
}

1 个答案:

答案 0 :(得分:0)

你做得很好!是的,有一个解决方案。关键方法是adapter.notifyDataSetChanged();如果你调用这个notifyDataSetChanged,那么适配器会尝试&#34;重绘&#34; ListView,所以如果您对数据源进行任何更改(在这种情况下,您将向列表中添加一个元素),您将看到不同数量的单元格。

所以你需要按照以下步骤操作:

1-替换列表的字符串[]

2-保留对创建的适配器的引用

3-每次进行更改时调用此适配器上的notifyDataSetChanged()(此方法应在UI线程中调用)

最终代码应如下所示:

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

    }
});