【问题标题】:Alternating colors in ListviewListview中的交替颜色
【发布时间】:2018-08-07 02:23:25
【问题描述】:

在我的列表视图getView 我有这样的代码

if (position % 2 == 0) { v.setBackgroundColor(Color.BLUE); }

这就是它的输出

但是如果数据看起来像这样呢

我尝试了上面的代码,但它看起来像这样

但我需要是这样的。

我不知道出了什么问题,但颜色图案每组都交换。如何根据最后一种格式修复它。总是以蓝色开头

更新

ItemModel.java

public class ItemModel implements Comparable<ItemModel> {
    private boolean isSectionHeader;
    private String cusname;
    private String date;
}

public String getCusname() {
    return cusname;
}

public void setCusname(String cusname) {
    this.cusname = cusname;
}

public boolean isSectionHeader() {
    return isSectionHeader;
}

@Override
public int compareTo(ItemModel itemModel) {
    return this.date.compareTo(itemModel.date);
}

public void setToSectionHeader() {
    isSectionHeader = true;
}

public String getDate() {
    return date;
}

public void setDate(String date) {
    this.date = date;
}

public String getRemarks() {
    return remarks;
}


public ItemModel(String cusname, String remarks, String date) {
        this.isSectionHeader = isSectionHeader;
        this.cusname = cusname;
        this.remarks = remarks;
        this.date = date;
}

这是我将数据从 sqllite 传输到数组的地方

private ArrayList<ItemModel> getItems() {
    Cursor data = myDb.get_plan(pattern_email);
    ArrayList<ItemModel> items = new ArrayList<>();
    while (data.moveToNext()) {
        String cusname = data.getString(0);
        String remarks = data.getString(2);
        String date = data.getString(3);
        items.add(new ItemModel(cusname, remarks, date));
    }
    return items;
}

这是排序器并在列表视图中显示

private ArrayList sortAndAddSections(ArrayList<ItemModel> itemList) {

    ArrayList<ItemModel> tempList = new ArrayList<>();
    ArrayList<Integer> tmpHeaderPositions = new ArrayList<>();
    Collections.sort(itemList);
    ItemModel sectionCell;

    String header = "";
    int addedRow = 0;
    for (int i = 0; i < itemList.size(); i++) {
        if (!(header.equals(itemList.get(i).getDate()))) {
            String cusname = itemList.get(i).getCusname();
            String remarks = itemList.get(i).getRemarks();
            sectionCell = new ItemModel(cusname, remarks, date);
            sectionCell.setToSectionHeader();
            tmpHeaderPositions.add(i + addedRow);
            addedRow++;
            tempList.add(sectionCell);
            header = itemList.get(i).getDate();
        }
        tempList.add(itemList.get(i));
    }

    tmpHeaderPositions.add(tempList.size());
    for (int i = 0; i < tmpHeaderPositions.size() - 1; i++) {
        sectionCell = tempList.get(tmpHeaderPositions.get(i));
        sectionCell.setDate(sectionCell.getDate() + " (" +
                (tmpHeaderPositions.get(i + 1) - tmpHeaderPositions.get(i) - 1) + ")");
    }
    return tempList;
}

这是我的看法

public View getView(int position, View convertView, ViewGroup parent) {
  /* Alternating Colors*/
    LinearLayout line_others = v.findViewById(R.id.line_others);

    if (position % 2 == 0) {
        line_others.setBackgroundResource(R.color.red);
    } else {                         
        line_others.setBackgroundResource(R.color.alt_gray);
    }
}

【问题讨论】:

    标签: android android-studio listview listviewitem


    【解决方案1】:

    以下是基于这里的答案:Alternating colors in listview but needs to have a starting color

    1. ItemModel 中添加一个新的 int 字段 bgColor 并创建 getter 和 setter 方法。
    2. 变化:

      private ArrayList sortAndAddSections(ArrayList<ItemModel> itemList) {
      
          ArrayList<ItemModel> tempList = new ArrayList<>();
          ArrayList<Integer> tmpHeaderPositions = new ArrayList<>();
          Collections.sort(itemList);
          ItemModel sectionCell;
      
          String header = "";
          int addedRow = 0;
          int bgColor = R.color.red; //Added
          for (int i = 0; i < itemList.size(); i++) {
              if (!(header.equals(itemList.get(i).getDate()))) {
                  String cusname = itemList.get(i).getCusname();
                  String remarks = itemList.get(i).getRemarks();
                  sectionCell = new ItemModel(cusname, remarks, date);
                  sectionCell.setToSectionHeader();
                  tmpHeaderPositions.add(i + addedRow);
                  addedRow++;
                  tempList.add(sectionCell);
                  header = itemList.get(i).getDate();
                  bgColor = R.color.red; //Added
              }
              sectionCell = itemList.get(i); //Added
              sectionCell.setBgColor(bgColor); //Added
              tempList.add(sectionCell); //Changed
              if (bgColor == R.color.red) bgColor = R.color.alt_gray; //Added
              else bgColor = R.color.red; //Added
          }
      
          tmpHeaderPositions.add(tempList.size());
          for (int i = 0; i < tmpHeaderPositions.size() - 1; i++) {
          sectionCell = tempList.get(tmpHeaderPositions.get(i));
          sectionCell.setDate(sectionCell.getDate() + " (" +
              (tmpHeaderPositions.get(i + 1) - tmpHeaderPositions.get(i) - 1) + ")");
          }
          return tempList;
      }
      
    3. 更改适配器 getView()。不再计算背景颜色,只需使用数据项中的 bgColor 设置即可。

    希望有帮助!

    【讨论】:

    • tysm。我会试试这个TYSM
    【解决方案2】:

    有一个名为 counter 的 int 变量,并在代码开头以及有新标头时将其设置为 0。

    然后对于每一行将计数器加一,如果计数器是偶数,则将背景设为蓝色。

    即。

    counter = 0;
    
    for each item in the list view {
    
    
    if (isHeader) {
    
        counter  = 0;
    
    } else {
    
        if (counter % 2 = 0) {
    
            background = blue;
    
        } 
        else {
    
            background = white;
    
        }
        counter++;
    }
    
    }
    

    【讨论】:

    • 我试过你说的,但它只给了我蓝色
    猜你喜欢
    • 2011-10-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-05
    • 1970-01-01
    • 2011-02-21
    • 2010-09-20
    相关资源
    最近更新 更多