Добавление представления в GridView с помощью ArrayAdapter

Я пытаюсь добавить представление в представление сетки, в котором есть ArrayAdapter. Логика заключается в том, что если в базе данных нет записи, будет добавлена ​​кнопка, предлагающая пользователю добавить запись, которая является этой кнопкой:

Добавление представления в GridView с помощью ArrayAdapter

Но тогда при запуске приложения кнопка не добавляется. Я тоже не получаю ошибок. вот мой код:

FragmentFood.java

public class FragmentFood extends Fragment {
    LinearLayout layout;
    ArrayList<Items> food = new ArrayList<>();
    ItemsAdapter itemsAdapter;
    GridView gridView;

    public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {

        View view = inflater.inflate(R.layout.fragment_food, container, false);
        layout = (LinearLayout)view.findViewById(R.id.layout);
        gridView = (GridView) view.findViewById(R.id.gridView);
        populateFoods();
        ItemsAdapter itemsAdapter = new ItemsAdapter(this.getContext(), food);
        gridView.setAdapter(itemsAdapter);
        return view;
    }

    private void populateFoods() {
        DBHelper dbHelper = new DBHelper(this.getContext());
        try {
            Cursor c = dbHelper.getAllData("food");
            if (c != null) {
                if (c.moveToFirst()) {
                    do {
                        String name = c.getString(c.getColumnIndex("name"));
                        String type = c.getString(c.getColumnIndex("type"));
                        double price = c.getDouble(c.getColumnIndex("price"));
                        food.add(new Items(name, type, price));
                    } while (c.moveToNext());
                }
            } else {
                Button btn = new Button(this.getContext());
                btn.setBackgroundResource(R.drawable.no_item);
                btn.setText("");
                gridView.addView(btn);
            }
        } catch (SQLiteException sql) {
            Log.e("error", " error sql", sql);
        }
    }
}

Адаптер

public class ItemsAdapter extends ArrayAdapter<Items> {


    public ItemsAdapter(Context context, ArrayList<Items> item) {
        super(context, 0, item);
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // Get the data item for this position
        Items item = getItem(position);
        // Check if an existing view is being reused, otherwise inflate the view
        if (convertView == null) {
            convertView = LayoutInflater.from(getContext()).inflate(R.layout.custom_button, parent, false);
        }
        // Lookup view for data population
        Button itemBtn = (Button)convertView.findViewById(R.id.itemBtn);
        // Populate the data into the template view using the data object
        itemBtn.setText(item.getName() + " " + item.getType());
        // Return the completed view to render on screen
        return convertView;
    }
}

XML файл

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

    <GridView
        android:id = "@+id/gridView"
        android:layout_width = "match_parent"
        android:layout_height = "match_parent" />
</LinearLayout>

В моей базе данных нет данных, поэтому должна появиться кнопка addItem. Я попытался добавить представление в родительский макет gridview, но кнопка также не отображается. Пожалуйста, помогите

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
0
157
3

Ответы 3

Да, это произойдет, потому что размер вашего адаптера равен нулю, поэтому адаптер не создает никаких представлений. В этом случае вам нужно передать хотя бы один элемент в адаптер, чтобы отображалась кнопка. если не хотите делать так, поместите кнопку во фрагмент ниже GridView.

Вы можете добавить View в представление сетки следующим образом:

    gridView = (GridView) view.findViewById(R.id.gridView);
    populateFoods();
    ItemsAdapter itemsAdapter = new ItemsAdapter(this.getContext(), food);
    gridView.setAdapter(itemsAdapter);
    View btnView = LayoutInflater.from(getContext()).inflate(R.layout.custom_button,null);
    gridView.addView(btnView);
    Button itemBtn = (Button)convertView.findViewById(R.id.itemBtn);

Можно ли добавить метод в мой класс адаптера, добавив настраиваемую кнопку, если переданный массив массивов равен нулю?

user10063142 31.07.2018 10:37

нет, потому что при нулевом элементе getView () не вызывается.

Shubham Vala 31.07.2018 10:39

если вы хотите добавить кнопку в сетку, передайте один элемент с пустым значением. и для получения элемента в getView добавьте +1 позицию в этом

Shubham Vala 31.07.2018 10:41

или вы можете добавить просмотр в сетку после вызова адаптера

Shubham Vala 31.07.2018 10:42

itemsAdapter.getItem (). getView () <- ?? Я хочу получить кнопку, чтобы изменить фоновое изображение этой кнопки

user10063142 31.07.2018 11:22

В разделе кода else вы не устанавливаете ширину и высоту кнопки, чтобы она не отображалась, попробуйте следующее: -

      //set the properties for button

       Button btn = new Button(this.getContext());
       btn.setLayoutParams(new LayoutParams(LayoutParams.WRAP_CONTENT, LayoutParams.WRAP_CONTENT));

       btn.setBackgroundResource(R.drawable.no_item);
       btn.setText("");
       gridView.addView(btn);

Добавлять новый элемент в arraylist и вызов адаптера. notifydatasetchanged

Другие вопросы по теме