Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view

This file was deleted.

Original file line number Diff line number Diff line change
@@ -0,0 +1,69 @@
package org.odk.collect.android.views

import android.content.Context
import android.graphics.Rect
import android.util.AttributeSet
import android.view.View
import androidx.core.content.ContextCompat
import androidx.recyclerview.widget.DividerItemDecoration
import androidx.recyclerview.widget.GridLayoutManager
import androidx.recyclerview.widget.RecyclerView
import com.google.android.flexbox.FlexboxLayoutManager
import org.odk.collect.android.R
import org.odk.collect.android.adapters.AbstractSelectListAdapter

class ChoicesRecyclerView @JvmOverloads constructor(
context: Context,
attrs: AttributeSet? = null
) : RecyclerView(context, attrs) {

private var maxHeight: Int? = null

@JvmOverloads
fun initRecyclerView(adapter: AbstractSelectListAdapter, isFlex: Boolean, maxHeight: Int? = null) {
this.maxHeight = maxHeight
if (isFlex) {
enableFlexboxLayout()
} else {
enableGridLayout(adapter.numColumns)
}
setAdapter(adapter)
}

override fun onMeasure(widthSpec: Int, heightSpec: Int) {
val boundedHeightSpec = maxHeight?.let {
MeasureSpec.makeMeasureSpec(it, MeasureSpec.AT_MOST)
} ?: heightSpec
super.onMeasure(widthSpec, boundedHeightSpec)
}

private fun enableFlexboxLayout() {
layoutManager = FlexboxLayoutManager(context)
val marginBetweenItems = resources.getDimensionPixelSize(org.odk.collect.androidshared.R.dimen.margin_standard)
addItemDecoration(FlexItemDecoration(marginBetweenItems))
}

private fun enableGridLayout(numColumns: Int) {
if (numColumns == 1) {
enableDivider()
}

layoutManager = GridLayoutManager(context, numColumns)
}

private fun enableDivider() {
val divider = DividerItemDecoration(context, DividerItemDecoration.VERTICAL)
val drawable = ContextCompat.getDrawable(context, R.drawable.inset_divider_64dp)
if (drawable != null) {
divider.setDrawable(drawable)
}
addItemDecoration(divider)
}

internal class FlexItemDecoration(private val margin: Int) : ItemDecoration() {
override fun getItemOffsets(outRect: Rect, view: View, parent: RecyclerView, state: State) {
outRect.bottom = margin
outRect.right = margin
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@
import org.odk.collect.android.widgets.interfaces.SelectChoiceLoader;
import org.odk.collect.android.widgets.utilities.QuestionFontSizeUtils;
import org.odk.collect.android.widgets.utilities.SearchQueryViewModel;
import org.odk.collect.androidshared.utils.ScreenUtils;

import static org.odk.collect.android.formentry.media.FormMediaUtils.getPlayableAudioURI;

Expand All @@ -41,7 +42,11 @@ public BaseSelectListWidget(Context context, QuestionDetails questionDetails, Se
items = ItemsWidgetUtils.loadItemsAndHandleErrors(this, questionDetails.getPrompt(), selectChoiceLoader);

logAnalytics(questionDetails);
binding.choicesRecyclerView.initRecyclerView(setUpAdapter(), Appearances.isFlexAppearance(getQuestionDetails().getPrompt()));
// Only let the list take up 90% of the screen height in order to speed up loading if there
// are many items, and so that when shown inline in a field-list group the user can still
// see the questions below it.
int maxHeight = (int) (ScreenUtils.getScreenHeight(getContext()) * 0.9);
binding.choicesRecyclerView.initRecyclerView(setUpAdapter(), Appearances.isFlexAppearance(getQuestionDetails().getPrompt()), maxHeight);
if (Appearances.isAutocomplete(getQuestionDetails().getPrompt())) {
setUpSearchBox();
}
Expand Down