我正在使用Like和Dislike Button的逻辑
我声明变量的地方
var user_like_dislike_state == 0
当我点击Like按钮值变为1时,如果我再次按下它将变回0
if(user_like_dislike_state == 0 || user_like_dislike_state == 1){
user_like_dislike_state = -1
} else {
user_like_dislike_state = 0
}
当我尝试在单一帖子上使用但当我尝试在Recyclerview中使用此逻辑时,它正在工作
如果我喜欢帖子1然后我尝试喜欢帖子4然后它会自动将值更改为0
我给了3个国家
user_like_dislike_state == 1 : **Like**
user_like_dislike_state == 0 : **Non**
user_like_dislike_state == -1 : **Dislike**
Adapter.kt:
class ViewsinglepostAdapter(var commentsList: ArrayList<Comment>, val upVote : View.OnClickListener, val downVote: View.OnClickListener): RecyclerView.Adapter<ViewsinglepostAdapter.ViewHolder>(){
var user_like_dislike_state = 0
var comment_id = 0
override fun onBindViewHolder(holder: ViewHolder, position: Int) {
holder.user_name?.setText(commentsList.get(position).User)
holder.comment?.setText(commentsList.get(position).comment)
holder.upvote?.setOnClickListener({
if(user_like_dislike_state == 0 || user_like_dislike_state == -1){
user_like_dislike_state = 1
} else {
user_like_dislike_state = 0
}
comment_id = commentsList.get(position).Id
upVote.onClick(it)
})
holder.downvote?.setOnClickListener({it->
if(user_like_dislike_state == 0 || user_like_dislike_state == 1){
user_like_dislike_state = -1
} else {
user_like_dislike_state = 0
}
comment_id = commentsList.get(position).Id
downVote.onClick(it)
user_like_dislike_state == 0
})
}
override fun onCreateViewHolder(parent: ViewGroup, viewType: Int): ViewHolder{
val itemView = LayoutInflater.from(parent.context).inflate(R.layout.singlecomment,parent,false)
return ViewHolder(itemView)
}
override fun getItemCount(): Int {
return commentsList.count()
}
class ViewHolder(itemView: View) : RecyclerView.ViewHolder(itemView){
var upvote: ImageView? = null
var downvote: ImageView? = null
var user_name: TextView? = null
var comment: TextView? = null
init {
this.upvote = itemView.findViewById(R.id.upvote_post_img)
this.downvote = itemView.findViewById(R.id.down_vote_post_img)
this.user_name = itemView.findViewById(R.id.user_name)
this.comment = itemView.findViewById(R.id.comment)
}
}
}
你只需要一个boolean
标志并将其初始值设置为false。单击按钮时,您只需使用turnery操作员更新其值即可获得您的价值
user_like_dislike_state = user_like_dislike_state?false:true;
//对于upvote按钮,你应该设置一个或-1。
holder.upvote?.setOnClickListener({
user_like_dislike_state = user_like_dislike_state<1?1:-1;
comment_id = commentsList.get(position).Id
upVote.onClick(it)
})
对于downvote按钮,你检查它已经投票或投票。
holder.downvote?.setOnClickListener({it->
user_like_dislike_state = user_like_dislike_state>-1?-1:0;
comment_id = commentsList.get(position).Id
downVote.onClick(it)
})
也许是因为Recyclerview,我假设有一个帖子/行在你向下滚动或向上滚动时消失了。当Recyclerview向上或向下滚动时,每个视图/行都会被重新加载,这就是为什么你总是得到0
使用成员user_like_dislike_state创建类:Int传递该类的ArrayList以回收适配器并在列表中单独处理每个行视图。
我建议在喜欢/不喜欢的时候使用局部变量,否则var user_like_dislike_state
将保留先前喜欢/不喜欢的状态,除非你重置它
只需在模型类示例中获取一个变量非常简单: - var like_Status
并在recyclelerview中单击时进行相应设置,当您滚动列表时检查该变量是否相似
if(like_statusbutton==-1)
{
setLikeStatus="dislike"
}
else if(like_status==1)
{
setLikeStatus="like"
}
else {
setLikeStatus="none"
}
您必须维护模型类中每个like按钮的状态。这就是您在代码中遇到此问题的原因。请保持模型类中每个类似按钮的状态,并在循环视图中滚动时检查按钮的先前状态。
我试过这段代码并且工作了:
I used **Hashmap** for save my Comment_id and user_like_state
代码:
//变量声明:
键和变量Int都是因为我的Comment_id和user_like_state是Int:
var commentHashMap = HashMap<Int, Int>()
然后为
Upvote:
holder.upvote?.setOnClickListener({
comment_id = commentsList.get(position).post_id
if(commentHashMap .get(comment_id) == null || commentHashMap.get(comment_id)== 0 || commentHashMap.get(comment_id)== -1){
commentHashMap.put(comment_id, 1)
} else{
commentHashMap.put(comment_id, 0)
}
upVote.onClick(it)
})
Downvote:
holder.downVote?.setOnClickListener({
comment_id = commentsList.get(position).post_id
if(commentHashMap .get(comment_id) == null || commentHashMap.get(comment_id)== 0 || commentHashMap.get(comment_id)== 1){
commentHashMap.put(comment_id, -1)
} else{
commentHashMap.put(comment_id, 0)
}
downVote.onClick(it)
})
想要类似于facebook的代码的人可以使用此代码