Java 使用ArrayAdapter将视图添加到GridView

Java 使用ArrayAdapter将视图添加到GridView,java,android,view,Java,Android,View,我正在尝试将视图添加到具有ArrayAdapter的栅格视图中。逻辑是,如果数据库中没有条目,将添加一个按钮,提示用户添加条目,即此按钮: 但是,当应用程序启动时,没有添加任何按钮。我也没有犯错误。这是我的密码: FragmentFood.java public class FragmentFood extends Fragment { LinearLayout layout; ArrayList<Items> food = new ArrayList<>

我正在尝试将视图添加到具有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);
        }
    }
}
公共类碎片扩展碎片{
线性布局;
ArrayList食品=新ArrayList();
项目捕捉器项目捕捉器;
GridView;
创建视图时的公共视图(LayoutFlater充气机、@Nullable ViewGroup容器、@Nullable Bundle savedInstanceState){
视图=充气机。充气(R.layout.fragment\u食品,容器,假);
layout=(LinearLayout)view.findViewById(R.id.layout);
gridView=(gridView)view.findViewById(R.id.gridView);
populateFoods();
ItemsAdapter ItemsAdapter=newitemsadapter(this.getContext(),food);
setAdapter(itemsAdapter);
返回视图;
}
私有void populateFoods(){
DBHelper DBHelper=newdbhelper(this.getContext());
试一试{
游标c=dbHelper.getAllData(“食物”);
如果(c!=null){
if(c.moveToFirst()){
做{
字符串名称=c.getString(c.getColumnIndex(“名称”));
字符串类型=c.getString(c.getColumnIndex(“类型”);
双倍价格=c.getDouble(c.getColumnIndex(“价格”));
添加(新项目(名称、类型、价格));
}而(c.moveToNext());
}
}否则{
Button btn=新按钮(this.getContext());
btn.挫折资源(R.可提取,无任何项目);
btn.setText(“”);
gridView.addView(btn);
}
}catch(SQLiteException sql){
Log.e(“错误”,“错误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;
    }
}
公共类ItemsAdapter扩展了ArrayAdapter{
公共项适配器(上下文,ArrayList项){
超级(上下文,0,项);
}
@凌驾
公共视图getView(int位置、视图转换视图、视图组父视图){
//获取此职位的数据项
项目=获取项目(位置);
//检查是否正在重用现有视图,否则会膨胀视图
if(convertView==null){
convertView=LayoutInflater.from(getContext()).flate(R.layout.custom_按钮,父项,false);
}
//数据填充的查找视图
Button itemBtn=(Button)convertView.findViewById(R.id.itemBtn);
//使用数据对象将数据填充到模板视图中
itemBtn.setText(item.getName()+“”+item.getType());
//返回要在屏幕上渲染的已完成视图
返回视图;
}
}
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下面的片段中

可以将视图添加到栅格视图,如下所示:

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

在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和call adapter中的一个新项。notifydatasetchanged

是否可以在我的适配器类中添加一个方法,如果传递的arraylist为零,则添加一个自定义按钮?否,因为当存在零项时,不会调用getView()。如果要在网格中添加按钮,则传递一个空值的元素。要在getView中获取项,请在该位置添加+1位置,或者可以在调用adapteritemsAdapter.getItem().getView()后将视图添加到网格视图