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