具有基于响应的动态元素的 RecyclerView
RecyclerView with dynamic elements based on response
我正在尝试创建一个 RecyclerView
来显示汽车列表以及每个行项目的各种标签。
例如:
宝马
v6,turbo ---> 标签
雇佣兵
V8,Twin-turbo,Carbon-Fiber ---> 标签
问题是标签是在 JSON
响应中检索的,并且可以是可变数量。但是,RecyclerView
的标题始终只有一个 textView
。
我当前的代码有一个简单的 RecyclerView
,我可以在其中显示各种汽车的名称,但是我不确定如何在基于固定标题的下方动态添加各种标签关于回应。
代码:
public class ListItemRecyclerViewAdapter extends RecyclerView.Adapter<ListItemRecyclerViewAdapter.ViewHolder>{
private List<BaseItem> listOfItems = new ArrayList<>();
private final List<TextView> textViewPool = new LinkedList<>();
public ListItemRecyclerViewAdapter(List<BaseItem> listItems){
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_list_item, parent, false);
return new ViewHolder(view);
}
@Override
public int getItemCount() {
return listOfItems.size();
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.carName.setText(((NewsItem)listOfItems.get(position)).getCar());
Categories categories = ((ListItem)listOfItems.get(position)).getCategories();
List<String> categoriesList = categories.getCategories();
holder.bindViewForChips(categoriesList);
}
@Override
public void onViewRecycled(@NonNull NewsViewHolder holder) {
super.onViewRecycled(holder);
holder.recycleTextViews();
}
// Clean all elements of the recycler
private void clear() {
listOfItems.clear();
}
public void addAll(List<BaseItem> list) {
clear();
listOfItems.addAll(list);
notifyDataSetChanged();
}
class ViewHolder extends RecyclerView.ViewHolder{
@BindView(R.id.car)
TextView carName;
private final List<TextView> textViews = new ArrayList<>();
private final ViewGroup container;
ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
container = (ViewGroup) itemView;
}
private void bindViewForChips(List<String> categories){
recycleTextViews();
for (int i = 0; i < categories.size(); i++) {
final TextView textView = getRecycledTextViewOrCreate();
textViewPool.add(textView);
container.addView(textView);
}
}
private TextView getRecycledTextViewOrCreate() {
// if (textViewPool.isEmpty()) {
return (TextView)LayoutInflater.from(container.getContext()).inflate(R.layout.chips_view, container, false);
//}
//return textViewPool.remove(0);
}
public void recycleTextViews() {
textViewPool.addAll(textViews);
textViews.clear();
container.removeAllViews();
}
}
}
感谢任何帮助。谢谢!
IMO 这在某种程度上也取决于您的 UI。如果您只想以逗号分隔格式显示标签,您可以遍历标签数组并使用 StringBuilder
创建一个字符串并将其分配给 TextView
.
您也可以在 recyclerView
中使用 recyclerView
,但我认为对于这种情况,这可能有点矫枉过正。如果标签是可点击的,你可以选择这个选项。这样您也可以为每个标签元素设置样式。或者交错列表也可能看起来不错。
选项 1:
在单个 TextView 中显示所有标签。在这种情况下,您的列表项 xml 将是这样的。
<TextView>BMW</TextView>
<TextView>ConcatenatedTagsFromArray</TextView>
选项 2:
在 child RV
中显示标签。在那种情况下 parent 列表项 xml 将是这样的。
<TextView>BMW</TextView>
<recyclerView>childRecyclerViewID</recyclerView>
然后在 parent RV
的 onBindViewHolder
方法中创建一个 recyclerview
object 并设置布局管理器和适配器并将标签数组作为数据传递。您还需要一个新的列表项 xml 用于 child 回收站视图的项目(但是您希望您的标签看起来像)。
我正在尝试创建一个 RecyclerView
来显示汽车列表以及每个行项目的各种标签。
例如:
宝马
v6,turbo ---> 标签
雇佣兵
V8,Twin-turbo,Carbon-Fiber ---> 标签
问题是标签是在 JSON
响应中检索的,并且可以是可变数量。但是,RecyclerView
的标题始终只有一个 textView
。
我当前的代码有一个简单的 RecyclerView
,我可以在其中显示各种汽车的名称,但是我不确定如何在基于固定标题的下方动态添加各种标签关于回应。
代码:
public class ListItemRecyclerViewAdapter extends RecyclerView.Adapter<ListItemRecyclerViewAdapter.ViewHolder>{
private List<BaseItem> listOfItems = new ArrayList<>();
private final List<TextView> textViewPool = new LinkedList<>();
public ListItemRecyclerViewAdapter(List<BaseItem> listItems){
}
@NonNull
@Override
public ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
View view = LayoutInflater.from(parent.getContext())
.inflate(R.layout.fragment_list_item, parent, false);
return new ViewHolder(view);
}
@Override
public int getItemCount() {
return listOfItems.size();
}
@Override
public void onBindViewHolder(@NonNull ViewHolder holder, int position) {
holder.carName.setText(((NewsItem)listOfItems.get(position)).getCar());
Categories categories = ((ListItem)listOfItems.get(position)).getCategories();
List<String> categoriesList = categories.getCategories();
holder.bindViewForChips(categoriesList);
}
@Override
public void onViewRecycled(@NonNull NewsViewHolder holder) {
super.onViewRecycled(holder);
holder.recycleTextViews();
}
// Clean all elements of the recycler
private void clear() {
listOfItems.clear();
}
public void addAll(List<BaseItem> list) {
clear();
listOfItems.addAll(list);
notifyDataSetChanged();
}
class ViewHolder extends RecyclerView.ViewHolder{
@BindView(R.id.car)
TextView carName;
private final List<TextView> textViews = new ArrayList<>();
private final ViewGroup container;
ViewHolder(View itemView) {
super(itemView);
ButterKnife.bind(this,itemView);
container = (ViewGroup) itemView;
}
private void bindViewForChips(List<String> categories){
recycleTextViews();
for (int i = 0; i < categories.size(); i++) {
final TextView textView = getRecycledTextViewOrCreate();
textViewPool.add(textView);
container.addView(textView);
}
}
private TextView getRecycledTextViewOrCreate() {
// if (textViewPool.isEmpty()) {
return (TextView)LayoutInflater.from(container.getContext()).inflate(R.layout.chips_view, container, false);
//}
//return textViewPool.remove(0);
}
public void recycleTextViews() {
textViewPool.addAll(textViews);
textViews.clear();
container.removeAllViews();
}
}
}
感谢任何帮助。谢谢!
IMO 这在某种程度上也取决于您的 UI。如果您只想以逗号分隔格式显示标签,您可以遍历标签数组并使用 StringBuilder
创建一个字符串并将其分配给 TextView
.
您也可以在 recyclerView
中使用 recyclerView
,但我认为对于这种情况,这可能有点矫枉过正。如果标签是可点击的,你可以选择这个选项。这样您也可以为每个标签元素设置样式。或者交错列表也可能看起来不错。
选项 1: 在单个 TextView 中显示所有标签。在这种情况下,您的列表项 xml 将是这样的。
<TextView>BMW</TextView>
<TextView>ConcatenatedTagsFromArray</TextView>
选项 2:
在 child RV
中显示标签。在那种情况下 parent 列表项 xml 将是这样的。
<TextView>BMW</TextView>
<recyclerView>childRecyclerViewID</recyclerView>
然后在 parent RV
的 onBindViewHolder
方法中创建一个 recyclerview
object 并设置布局管理器和适配器并将标签数组作为数据传递。您还需要一个新的列表项 xml 用于 child 回收站视图的项目(但是您希望您的标签看起来像)。