【问题标题】:Android Error on ListView with a section seperator?带有部分分隔符的 ListView 上的 Android 错误?
【发布时间】:2025-12-24 14:35:11
【问题描述】:

this is the target listview 在我想要的安卓应用中。

如您所见,有两种类型的单元格,“橙色”和“红色”,我可以很容易地将它放在 ListView 中,因为 ListView 可以有不同类型的单元格。我想知道分隔符中间部分,其中列表视图中只有 1 个,我应该如何处理它?它也应该只是另一种类型的细胞还是有更好的方法来做这样的事情?

【问题讨论】:

  • 这很简单,每个列表视图项都有其特定的布局,您可以根据项目更改颜色,因此您也可以将项目更改为灰色,例如分隔线和不可见的其他元素。

标签: java android listview


【解决方案1】:

这可以通过使用 "RecyclerView""RecyclerView.Adapter" 轻松解决。

在adpater类中,重写getItemViewType方法并根据位置指定条件,你想要什么类型的视图。

之后,在“onCreateViewHolder方法”中,根据上面返回的itemViewType创建一个ViewHolder实例。

之后,在“onBindViewHolder 方法”中,根据 itemViewType 将接收到的 holder 投射到相应的 viewholder 中。

PS:下面创建的 ViewHolders 可以包含列表视图(Recycler/ListView)或简单视图(TextView 等)

示例:

public class Adapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {

    public RecyclerView.ViewHolder onCreateViewHolder(@NonNull ViewGroup parent, int viewType) {
          switch(viewType){
              case R.layout.list_item_one : 
                      return ViewHolderOne(LayoutInflator.from(parent.context()).inflate(R.layout.list_item_one, parent, false));          
              case R.layout.list_item_two : 
                      return ViewHolderTwo(LayoutInflator.from(parent.context()).inflate(R.layout.list_item_two, parent, false));          
              default : 
                      return ViewHolderDefault(LayoutInflator.from(parent.context()).inflate(R.layout.list_item_default, parent, false));
          }

    }

    public void onBindViewHolder(@NonNull RecyclerView.ViewHolder viewHolder, int position) {
       int viewType = getItemViewType(position);
       swtich(viewType){
             case R.layout.list_item_one : 
                   ViewHolderOne holder = (ViewHolderOne) viewHolder; //perform your operations here... 
             break;
             
             case R.layout.list_item_two : 
                   ViewHolderTwo holder = (ViewHolderTwo) viewHolder; //perform your operations here... 
             break; 
             
             default : 
                   ViewHolderDefault holder = (ViewHolderDefault) viewHolder; //perform your operations here... 
             break;
       }
 
    }

    public int getItemCount() {
        return //getListSize;
    }

    @Override
    public int getItemViewType(int position) {
        switch(position){
            case 1: return R.layout.list_item_one;
            case 2: return R.layout.list_item_two;
            default: return R.layout.list_item_default;
        }
    }

【讨论】:

  • 什么是 R.layout.list_item_default?是“分隔符”吗?
  • 不,它不是分隔符。它可以是您想要的任何视图/视图组/列表视图,或者您甚至可以根据您的用例省略它。在您给出的示例中,它可能是分隔符之后的另一个列表。
  • 如果我有多个单元格,这将不起作用。即,在您的getItemViewType 中,您正在担任该职位。如果位置1, 2, 3 我有list_item_one4 是分隔符而5, 6, 7list_item_two?这将如何运作?
最近更新 更多