【问题标题】:Android Adapter to gridView - List of Buttons instead of List names of ButtonsAndroid Adapter to gridView - 按钮列表而不是按钮列表名称
【发布时间】:2017-02-21 19:04:05
【问题描述】:

在许多示例和教程中 - 如何使用 gridView 和适配器是这样的,在我们的适配器中,我们实现了一些列表,例如 gridView 中的项目名称。

我们重写了 Adapter 中的 getView 方法。然后我们在 gridView 中充气我们的项目。接下来我们将其文本更改为列表中的文本[位置]

下面是代码示例:

公共类 TileAdapter 扩展 BaseAdapter{

private Context context;
private Tile[] tiles;

public TileAdapter(Context context, Tile[] tiles){
    this.context = context;
    this.tiles= tiles;
}

@Override
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.layout_tile, null);

        TextView textView = (TextView) gridView.findViewById(R.id.tile_title);
        textView.setText(tiles[position].getTitle());

    }else{
        gridView = (View) convertView;
    }

    return gridView;

}

一切正常。但是如果我需要从它的列表中创建项目呢?

假设我们在某个地方List<Button> buttons 有我们在其他类中也使用的按钮。 GridView Adapter 从“MainClass”这个列表中获取。

如何在适配器中编码getView() 以将此列表中的按钮设置为项目? 所以不要创建新按钮,并告诉新按钮的标签与列表中的标签相同,而是将列表中的这个按钮完全放入gridView!

所以我需要这样的东西吗?你知道这个想法吗?

Field 是我扩展 Button 的类

@Override

public View getView(int position, View convertView, ViewGroup parent) {

        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);

        if(convertView == null){

            view= new View(context);
            view= inflater.inflate(R.layout.field_layout, null);

            //This is bad - but You know what i want?
            Field field = (Field) view.findViewById(R.id.field);
            field = fields.get(position);

        }else{
            view= (View) convertView;
        }

        return view;
    }

【问题讨论】:

    标签: android gridview android-adapter baseadapter


    【解决方案1】:

    getView() 被调用时,没有什么会强迫你膨胀所有的项目。 相反,您可以在创建适配器并返回它们时创建/接收视图列表。

    所以一个例子是:

    public class TileAdapter extends BaseAdapter {
    
        List<View> views = new ArrayList<>();
    
        public void setViews(@NonNull List<View> views) {
            this.views = views;
            notifyDataSetChanged();
        }
    
        @Override
        public int getCount() {
            return views.size();
        }
    
        @Override
        public Object getItem(int i) {
            return views.get(i);
        }
    
        @Override
        public long getItemId(int i) {
            return i;
        }
    
        @Override
        public View getView(int i, View view, ViewGroup viewGroup) {
            return views.get(i);
        }
    }
    

    【讨论】:

    • 我不明白。这是什么视图,以及如何从列表中扩展此按钮?
    • 可以像在inflater.inflate(R.layout.field_layout, null); 中那样对视图进行膨胀,您可以在活动中膨胀它们并将它们传递给适配器或适配器构造函数。也许您应该在继续之前阅读此内容 - vogella.com/tutorials/AndroidCustomViews/article.html
    猜你喜欢
    • 1970-01-01
    • 2013-10-05
    • 2011-01-13
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 2020-12-29
    • 1970-01-01
    相关资源
    最近更新 更多