FormLayoutManager -- 每格設置不同背景顏色或字體顏色

FormLayoutManager首頁,裏面有github地址

BaseFormModel基類

public abstract class BaseFormModel {
    protected List<Integer> textColors = new ArrayList<>();
    protected List<Integer> bgColors = new ArrayList<>();

    public List<Integer> getTextColors() {
        return textColors;
    }

    public void setTextColors(List<Integer> textColors) {
        this.textColors = textColors;
    }

    public List<Integer> getBgColors() {
        return bgColors;
    }

    public void setBgColors(List<Integer> bgColors) {
        this.bgColors = bgColors;
    }
}

這個類的內容比較少,就保存一個字體顏色列表和背景顏色列表。假如你的表格是水平表格(即一行代表一個實體那種)。那這個字體顏色列表就是代表一行item的字體顏色(背景顏色列表同理)。

 

Adapter基類的onBindViewHolder

這裏只拿BaseHFormAdapter來說明,以前介紹的Adapter基類的onBingViewHolder代碼和下面的有點不同,因爲下面是最新的代碼邏輯。

    @Override
    public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
        List<Integer> colorList = new ArrayList<>();
        int rowIndex = position / getColumnCount();
        int columnIndex = position % getColumnCount();
        T model = mList.get(rowIndex);
        String rowData = getRowData(model, columnIndex);
        if (model instanceof BaseFormModel){
            List<Integer> textColors = getTextColors((BaseFormModel) model);
            List<Integer> bgColors = getBgColors((BaseFormModel) model);
            if (textColors.size() > 0){
                colorList.add(textColors.get(columnIndex));
            }
            if (bgColors.size() > 0){
                colorList.add(bgColors.get(columnIndex));
            }

            Integer[] colors = new Integer[colorList.size()];
            colorList.toArray(colors);
            setData(holder, rowIndex, columnIndex, rowData, colors);
        }

        setData(holder, rowIndex, columnIndex, rowData);
    }

與以前不同的是,增加一個判斷

if (model instanceof BaseFormModel){
.....
}

只要你的實體繼承了BaseFormModel,就會進入這個條件內,這段邏輯就會調用帶有colors參數的setData方法,然後你自己寫的adapter就可以重寫這setData的方法,從而使用colors

    @Override
    protected void setData(RecyclerView.ViewHolder viewHolder, int rowIndex, int columnIndex, String content, Integer... colors) {
        ItemHolder holder = (ItemHolder) viewHolder;
        holder.tvItem.setText(content);
        holder.tvItem.setTextColor(colors[0]);
    }

 

總結

其實之前沒用BaseFormModel,一樣可以不同item設置不同顏色。因爲setData的方法裏可以知道該item所在的行和列,那根據行和列可以拿到該實體的數據,一樣可以判斷要顯示什麼顏色。

但我不太希望把這些判斷顯示什麼顏色的邏輯放到adapter設置數據那裏,我希望的是在構建實體的時候,就把它要設置的對應顏色都配置好,這樣在adapter那裏只要設置數據就行了,不用進行太多的邏輯處理。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章