KotlinLeaner
06/21/2023, 12:54 PM@Composable
fun SeeAllView(
viewModel: MainActivityViewModel,
handleItemSelection: (TestDataModel) -> Unit,
ctaAction: (CurrentModel) -> Unit,
) {
LazyColumn(
modifier = Modifier.fillMaxSize(),
contentPadding = PaddingValues(16.dp),
verticalArrangement = Arrangement.spacedBy(20.dp),
) {
items(viewModel.itemList, key = { it.index }) { item ->
ListContent(false, item, ctaAction, handleItemSelection)
}
}
}
@Composable
fun ListContent(
useSpaceView: Boolean = true,
myTestDataItem: TestDataModel,
ctaAction: (CurrentModel) -> Unit,
handleItemSelection: (TestDataModel) -> Unit,
) {
val name = myTestDataItem.name
val image = myTestDataItem.iconUrl
val summary = myTestDataItem.summary
val currentModel = myTestDataItem.eventModel.currentModel
AnimatedVisibility(visible = useSpaceView) {
Spacer(Modifier.height(20.dp))
}
ListItem(name, image, summary, currentModel, ctaAction) {
handleItemSelection(myTestDataItem)
}
}
@OptIn(ExperimentalMaterial3Api::class)
@Composable
fun ListItem(
name: String,
image: Int,
summary: String,
currentModel: CurrentModel,
ctaAction: (CurrentModel) -> Unit,
openBottomSheet: () -> Unit
) {
Card(
modifier = Modifier
.fillMaxSize(),
colors = CardDefaults.cardColors(containerColor = Color.White),
shape = RoundedCornerShape(20.dp),
elevation = CardDefaults.cardElevation(defaultElevation = 2.dp),
onClick = { openBottomSheet() },
) {
Column(
modifier = Modifier.padding(20.dp)
) {
PanelHeaderView(name, image)
SummaryView(summary)
CtaView(
modifier = Modifier
.align(Alignment.End),
currentModel,
ctaAction,
)
}
}
}
@Composable
private fun PanelHeaderView(testName: String, testImage: Int) {
Row(
modifier = Modifier.fillMaxWidth(),
verticalAlignment = Alignment.CenterVertically,
) {
Image(
modifier = Modifier.weight(0.1f),
painter = painterResource(testImage),
contentDescription = null
)
AnimatedVisibility(
visible = testName.isNotEmpty(),
modifier = Modifier
.weight(0.8f)
.padding(start = 20.dp),
) {
Text(
text = testName,
maxLines = 1,
overflow = TextOverflow.Ellipsis
)
}
Icon(
imageVector = Icons.Filled.ArrowBack,
contentDescription = null,
tint = Color.Black
)
}
}
@Composable
private fun SummaryView(summary: String) {
AnimatedVisibility(visible = summary.isNotEmpty()) {
AndroidView(
modifier = Modifier.padding(top = 20.dp),
factory = { context -> TextView(context) },
update = { textView ->
with(textView) {
text = HtmlCompat.fromHtml(summary, HtmlCompat.FROM_HTML_MODE_COMPACT)
setTextColor(ContextCompat.getColor(context, R.color.black))
setTextSize(TypedValue.COMPLEX_UNIT_PX, 60F)
}
}
)
}
}
@Composable
private fun CtaView(
modifier: Modifier,
currentModel: CurrentModel,
ctaAction: (CurrentModel) -> Unit,
) {
AnimatedVisibility(
modifier = modifier,
visible = currentModel.showCtaAction
) {
ClickableText(
modifier = Modifier.padding(top = 20.dp),
text = AnnotatedString(currentModel.actionTitle),
onClick = { ctaAction(currentModel) }
)
}
}
KotlinLeaner
06/21/2023, 12:58 PMclass MainActivity : AppCompatActivity() {
private val binding by lazy { ActivityMainBinding.inflate(layoutInflater) }
private val viewModel by viewModel<MainActivityViewModel>()
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setupViewModel()
setContentView(binding.root)
}
private fun setupViewModel() {
viewModel.requestCompleteLiveData.observe(this) { dataReturned ->
if (dataReturned) {
setupView()
}
}
viewModel.createData()
}
private fun setupView() {
binding.composeView.setContent {
AppBarScaffold(R.string.app_name, true) {
SeeAllView(viewModel, {}, {})
}
}
}
}
Tower Guidev2
06/21/2023, 2:50 PMHtmlCompat.fromHtml(summary, HtmlCompat.FROM_HTML_MODE_COMPACT)
KotlinLeaner
06/21/2023, 2:52 PMKotlinLeaner
06/21/2023, 2:53 PMTower Guidev2
06/21/2023, 2:58 PMTower Guidev2
06/21/2023, 2:59 PMKotlinLeaner
06/21/2023, 3:01 PMTower Guidev2
06/21/2023, 3:01 PMKotlinLeaner
06/21/2023, 3:01 PMTower Guidev2
06/21/2023, 3:02 PMKotlinLeaner
06/21/2023, 3:03 PMKotlinLeaner
06/21/2023, 3:03 PMTower Guidev2
06/21/2023, 3:06 PMRoom.inMemoryDatabaseBuilder(appContext, MyMemoryDatabase::class.java)
.addMigrations(
Migration_ONE_to_TWO(),
Migration_TWO_to_THREE(),
Migration_THREE_to_FOUR(),
Migration_FOUR_to_FIVE(),
)
.addCallback(callback)
.build()
KotlinLeaner
06/21/2023, 3:06 PMTower Guidev2
06/21/2023, 3:06 PMKotlinLeaner
06/21/2023, 3:07 PMTower Guidev2
06/21/2023, 3:08 PMTower Guidev2
06/21/2023, 3:08 PMKotlinLeaner
06/21/2023, 3:08 PMTower Guidev2
06/21/2023, 3:09 PMSean Proctor
06/21/2023, 5:19 PMupdate
in SummaryView
called? If the text calculation is expensive. you can remember
it outside of the AndroidView
. That section is the only thing that looks suspicious to me. You could try migrating SummaryView
to compose instead of using the interop.KotlinLeaner
06/21/2023, 5:23 PMKotlinLeaner
06/21/2023, 5:23 PMHow often is update in SummaryView called?
Sean Proctor
06/21/2023, 5:24 PMKotlinLeaner
06/21/2023, 5:25 PMSean Proctor
06/21/2023, 5:25 PMKotlinLeaner
06/21/2023, 5:27 PMKotlinLeaner
06/21/2023, 5:27 PMKotlinLeaner
06/21/2023, 5:32 PMText
instead of AndroidView
. It still have slow scrolling issueSean Proctor
06/21/2023, 5:55 PMSummaryView
. I still have the issue when making that a no-op.KotlinLeaner
06/21/2023, 5:56 PMSean Proctor
06/21/2023, 5:56 PMKotlinLeaner
06/21/2023, 5:57 PMSean Proctor
06/21/2023, 6:12 PMAnimatedVisibility
causing the issues. After removing them, it's a bit jittery, but seems usable for a debug build.KotlinLeaner
06/21/2023, 6:13 PMAnimatedVisibility
?Sean Proctor
06/21/2023, 6:14 PMKotlinLeaner
06/21/2023, 6:16 PMAnimatedVisibility
or not.Sean Proctor
06/21/2023, 6:34 PMSean Proctor
06/21/2023, 6:39 PMSean Proctor
06/21/2023, 6:39 PMLazyColumn
, Column
scrolls smoothly.KotlinLeaner
06/21/2023, 6:40 PMLazyColumn
.KotlinLeaner
06/21/2023, 6:40 PMKotlinLeaner
06/21/2023, 6:41 PMSean Proctor
06/21/2023, 6:55 PMSean Proctor
06/21/2023, 6:57 PMKotlinLeaner
06/21/2023, 7:03 PMColumn
works much faster than LazyColumn
Timo Drick
06/22/2023, 7:12 AM