Динамическое изменение количества столбцов в StaggeredGridLayout на основе позиции элемента - PullRequest
0 голосов
/ 01 июля 2019

Я хотел бы получить этот макет для списка (n) элементов: this layout

Пока что я могу отображать элементы в двух столбцах, но как мне это сделать?объединить два столбца в одном для конкретной позиции (т. е. как пункт 7)?

Я пробовал много решений, предоставленных в SO, а также другие, но ни один из них не работал для меня.Решения при условии, что они либо использовали LinearLayout, надувая статические макеты, либо предоставляли решение для разбиения в столбцах.

Я также пытался использовать метод setSpanLookup, но не повезло ..

Ответы [ 3 ]

0 голосов
/ 01 июля 2019

Просто создайте таблицу: В вашем случае это 8 строк и 3 столбца, установите границы и выравнивание границ, элементы 7 и 14 займут 3 ячейки. Вот пример:

private void insertCell(PdfPTable table, String text, int align, int colspan, Font font) {

    //create a new cell with the specified Text and Font
    PdfPCell cell = new PdfPCell(new Phrase(text.trim(), font));
    //set the cell alignment
    cell.setHorizontalAlignment(align);
    //set the cell column span in case you want to merge two or more cells
    cell.setColspan(colspan);
    //in case there is no text and you wan to create an empty row
    if (text.trim().equalsIgnoreCase("")) {
        cell.setMinimumHeight(10f);
    }
    //add the call to the table
    table.addCell(cell);
}
0 голосов
/ 01 июля 2019

Наконец, решение, которое сработало для меня после изнурительной борьбы, здесь:

    @Override
        public void onViewAttachedToWindow(MyViewHolder holder) {
            super.onViewAttachedToWindow(holder);
            ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
            if(lp != null
                    && lp instanceof StaggeredGridLayoutManager.LayoutParams
                    && (holder.getLayoutPosition() == 6 || holder.getLayoutPosition() == 13)) {
                StaggeredGridLayoutManager.LayoutParams p = (StaggeredGridLayoutManager.LayoutParams) lp;
                p.setFullSpan(true);
            }
           holder.setIsRecyclable(false);
        }

Надеюсь, это поможет и вам.

0 голосов
/ 01 июля 2019

Как вы сказали, setSpanLookup - лучший метод, я думаю.

Попробуйте этот код:

class MainActivity : AppCompatActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        val layoutManager = GridLayoutManager(this, 2)
        layoutManager.spanSizeLookup = object : GridLayoutManager.SpanSizeLookup() {
            override fun getSpanSize(position: Int): Int {
                if (position == 6 || position == 13) return 2
                else return 1
            }
        }
        rv.layoutManager = layoutManager

        val items = mutableListOf<String>()
        for (i in 1..14) {
            items.add("item$i")
        }
        rv.adapter = MyAdapter(items)
    }
}

Вам нужно знать значение getSpanSize Возвращенный означает вес,не количество столбцов.

С точки зрения расположения элементов, вы можете использовать разные ViewHolder в специальной позиции.

Например:

companion object{
    const val NORMAL = 0
    const val WIDE = 1
}

override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): Holder {
    ...
    if (viewType == WIDE) return WideViewHolder(wideView)
    else return NormalViewHolder(normalView)
}

override fun getItemViewType(position: Int): Int {
    if (position == 6 || position == 13) {
        return WIDE
    }
    return NORMAL
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...