Я пытаюсь добавить представление в представление сетки, в котором есть 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, но кнопка также не отображается. Пожалуйста, помогите




Да, это произойдет, потому что размер вашего адаптера равен нулю, поэтому адаптер не создает никаких представлений. В этом случае вам нужно передать хотя бы один элемент в адаптер, чтобы отображалась кнопка. если не хотите делать так, поместите кнопку во фрагмент ниже 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);
нет, потому что при нулевом элементе getView () не вызывается.
если вы хотите добавить кнопку в сетку, передайте один элемент с пустым значением. и для получения элемента в getView добавьте +1 позицию в этом
или вы можете добавить просмотр в сетку после вызова адаптера
itemsAdapter.getItem (). getView () <- ?? Я хочу получить кнопку, чтобы изменить фоновое изображение этой кнопки
В разделе кода 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
Можно ли добавить метод в мой класс адаптера, добавив настраиваемую кнопку, если переданный массив массивов равен нулю?