Jetpack compose lazycolumn change items with on item click

Viewed 36

I'm new in the compose and i am trying to do some changes in lazycolumn with a like button click, it's like an instagram, when i was click to do button, button color and like count should be changed, i tried so many things but it doesn't work if u can help me i will be grateful

---viewmodel---

@HiltViewModel
class MainViewModel @Inject constructor(private val repository: QuicktationRepo) : ViewModel() {
    var errorMessage = mutableStateOf("")
    var scanIndex = mutableStateOf(0)
    var mainList2 = mutableStateOf<List<Quotation>>(listOf())
    var isDeleted = mutableStateOf(5)

    init {
        loadMains(1)
    }

    fun loadMains(userid: Int) {
        viewModelScope.launch {
            when (val result = repository.postMainApi(userid)) {
                is Resource.Success -> {
                    mainList2.value = result.data!!.response.quotations.toMutableStateList()
                    scanIndex.value = result.data.response.scanIndex
                    errorMessage.value = ""
                }
                is Resource.Error -> {
                    errorMessage.value = result.message!!
                    println(errorMessage.value)
                }
            }
        }
    }

    fun amILike(userid: Int, quoteId: Int) {
        viewModelScope.launch {
            when (val result = repository.postLikeApi(userid, quoteId)) {
                is Resource.Success -> {
                    isDeleted.value = result.data!!.response.isDeleted
                    errorMessage.value = ""
                }
                is Resource.Error -> {
                    errorMessage.value = result.message!!
                    println(errorMessage.value)
                }
            }
        }
    }
}

--homepage--

fun HomePage(navController: NavController) {
val interactionSource =  MutableInteractionSource()
val isPressed by interactionSource.collectIsPressedAsState()
Surface(modifier = Modifier.fillMaxSize(), color = Color(0xFFDDDDDD)) {
}
Column(
    verticalArrangement = Arrangement.Top,
    horizontalAlignment = Alignment.CenterHorizontally,
    modifier = Modifier.fillMaxSize()
) {
    Column(
        verticalArrangement = Arrangement.Top,
        horizontalAlignment = Alignment.CenterHorizontally,
        modifier = Modifier.fillMaxSize()
    )
    {
        PostList(navController = navController)
    }
}

}

--homepagecomposables--

@Composable
fun PostList(navController: NavController, viewModel: MainViewModel = hiltViewModel()) {
    val postList by remember { viewModel.mainList2 }
    val errorMessage by remember { viewModel.errorMessage }
    val context = LocalContext.current
    val scanIndex by remember { viewModel.scanIndex}
    PostListView(posts = postList, navController = navController)
    if (errorMessage.isNotEmpty()) {
        Toast.makeText(context, errorMessage, Toast.LENGTH_LONG).show()
    }
}
@Composable
fun PostListView(posts: List<Quotation>, navController: NavController) {
    LazyColumn(contentPadding = PaddingValues(top = 5.dp, bottom = 50.dp), verticalArrangement = Arrangement.SpaceEvenly) {
        items(posts){ post ->
            MainRow(post = post, navController = navController)
        }
    }
}

@Composable
fun RefreshWithLike(viewModel: MainViewModel = hiltViewModel(), userId: Int, id: Int,navController: NavController) {
    viewModel.amILike(userId,id)
}

@Composable
fun MainRow(viewModel: MainViewModel = hiltViewModel(), post: Quotation, navController: NavController) {
    Box(modifier = Modifier
        .fillMaxWidth()
        .wrapContentSize(), contentAlignment = Alignment.TopStart)
    {
        IconButton(
            onClick = {
                isPressed = true
            },interactionSource = colorControl, modifier = Modifier
                .size(21.dp, 20.dp)
        ) {
            Icon(
                painter = painterResource(id = R.drawable.like),
                contentDescription = "like",
                tint = color.value,
                modifier = Modifier
                    .size(21.dp, 20.dp)
            )
        }
        if(isPressed)
        {
            RefreshWithLike(viewModel,1,id,navController)
            isPressed = false
        }
    }
}
0 Answers
Related