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
}
}
我有一个像这样的数组: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
}
}