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 LazyColumnTimo Drick
06/22/2023, 7:12 AM