GridviewAdapter - 第一个元素个体(不在数组中)

GridviewAdapter - first element individual (not in array)

我有一个像这样的数组:String[] values = {"val1", "val2", "val3"}

现在我将这个值放入我的 Gridview 中。 到目前为止一切都很好。

但现在我正在尝试向此网格视图添加一个特定值。这应该是我的 Gridview 的第一个值,不应影响我的 String[] 中其他值的位置。

@Override
public View getView(final int position, View convertView, ViewGroup parent){
      TextView textView = (TextView)view.findViewById(R.id.gridview_textview);
      textView.setText(values[position]);
};

在这个函数中我设置了值! 我也尝试用布尔值来检查它是否是第一个元素,但这会影响位置。在这种情况下,它只是覆盖 "val1"

执行此操作的最佳方法是使用单独的数组(甚至 ArrayList<String>)作为适配器中的数据集。然后你在适配器中设置你的数据集,而不是仅仅提供 values 你可以做这样的事情:

String[] values = new String[] {"val1", "val2", "val3"};
ArrayList<String> dataset = new ArrayList<>();
dataset.add("back");
for(int i = 0; i < values.length; i++) {
    dataset.add(values[i]);
}
//provide dataset to adapter

编辑 #1

如果您在单个适配器中使用多种数据类型,我喜欢使用的方法是使用 ArrayList<Object>,或您正在使用的数据类型的其他一些常见的超级 class和。如果您没有为您的按钮使用某个 class,您可以为该按钮创建一个 ViewModel class,让 BlackButtonViewModel.

然后在设置数据集时,您可以执行以下操作:

List<Article> articles = ...
List<Object> dataset = new ArrayList<>();
dataset.add(new BlackButtonViewModel());
dataset.addAll(articles);

然后在您的适配器中创建视图时,您可以这样做:

private enum ItemViewType {
    BlackButton(1), Article(2);

    private int id;

    ItemViewType(int id) {
        this.id = id;
    }

    public int getId() {
        return id;
    }
}

class BlackButtonViewHolder extends RecyclerView.ViewHolder {
    BlackButtonViewHolder(View itemView) {
        super(itemView);
    }
}

class ArticleViewHolder extends RecyclerView.ViewHolder {
    ArticleViewHolder(View itemView) {
        super(itemView);
    }
}

public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
    if(viewType == ItemViewType.BlackButton.getId()) {
        View v = ...inflate black button layout
        return new BlackButtonViewHolder(v);
    } else if (viewType == ItemViewType.Article.getId()) {
        View v = ...inflate article layout
        return new ArticleViewHolder(v);
    }
}

@Override
public int getItemViewType(int position) {
    Object item = dataset.get(position);
    if(item instanceof BlackButtonViewModel) {
       return ItemViewType.BlackButton.getId();
    } else if(item instanceof Article) {
       return ItemViewType.Article.getId();
    }
}

@Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {

    if(holder instanceof BlackButtonViewHolder) {
       BlackButtonViewModel model = (BlackButtonViewModel) dataset.get(position);
       ...set up black button view contents
    } else if (holder instanceof ArticleViewHolder) {
       Article article = (Article) dataset.get(position);
       ...set up article view contents
    }
}