尝试用kotlin做一个app(十八)

评论 点赞功能

评论的数据库表

这个表可以指定username在postid下,于pubdate时间里,aite(@xxx)发表了评论

点赞的数据库表也类似

 可以这样描述,username于pubdate时间,在postid下,点赞了commentid

然后就是做网络请求接口之类的

先说点赞功能,遇到了一个问题:

 显示点赞列表的是一个LinearLayout,需要动态往里面添加ImageView,但是使用addView添加的时候,ImageView默认的宽度貌似变成match_parent,所以只能显示最后添加的imageview

LinearLayout布局

 <RelativeLayout
            android:layout_width="match_parent"
            android:layout_height="40dp"
            android:paddingTop="20dp">
            <LinearLayout
                android:background="@drawable/borders1"
                android:id="@+id/liked_container"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:orientation="horizontal"
                android:layout_alignParentStart="true">

动态添加imageView,我这里特地给imageView加了一个背景色

for(i in 0 until likedList!!.size){
                var imageView=NiceImageView(this)
                var avatarImgUrl=baseUrl+likedList[i].avatar
                Picasso.get().load(avatarImgUrl).into(imageView)
                var linearLayout=findViewById<LinearLayout>(R.id.liked_container)
                imageView.setBackgroundColor(Color.RED)
                linearLayout.addView(imageView)
            }

一个简单的解决办法是直接在布局文件中定义五个imegeview,然后动态设置它们的imageResource就好了

但是我想可以试着动态设置一下imageView的宽高

我试着这样设置

imageView.adjustViewBounds=true
                var layoutParams=imageView.layoutParams
                layoutParams.width=20
                layoutParams.height=20

                imageView.layoutParams=layoutParams

报错:java.lang.NullPointerException: Attempt to write to field 'int android.view.ViewGroup$LayoutParams.width' on a null object reference

原因貌似是我这是动态创建的ImageView,ViewGroup为空

那之前好像还有个办法设置控件宽高

addView可以接受两个参数

linearLayout.addView(imageView,params)

第二个参数可以设置控件宽高,边距之类的

params=RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)

var width=ScreenDimen.getInstance(this).pdToPix(30)
                var height=ScreenDimen.getInstance(this).pdToPix(30)
                var rightMargin=ScreenDimen.getInstance(this).pdToPix(30)
                var params=RelativeLayout.LayoutParams(width,height)
                params.rightMargin=rightMargin
                linearLayout.addView(imageView,i,params)

这样就可以了

但是这样又有一个问题,如何设置两个imageView的leftMargin或者rightMargin?

params.rightMargin=rightMargin

这样是无效的

为啥无效我也不知道了。尴尬!!但是我想个别的办法,设置一下它的padding好了

imageView.setPadding(padding,0,padding,0)

 (这里左右padding设置为x,那imageView的高不变,宽就应该+x*4)

然后把这段代码封装成一个函数

fun updateLikedList(){

        val count=LoadWebData().getLikedCount(postId,null)
        liked_count.text="楼主收到${count}个赞"
        if(count==0){
            liked_container.visibility=View.GONE
        }else{
            liked_container.visibility=View.VISIBLE
            val likedList=LoadWebData().loadLikedList(1,5,postId,null);
            val count=LoadWebData().getLikedCount(postId,null)
            liked_count.text="楼主收到${count}个赞"
            liked_container.removeAllViews()
            for(i in 0 until likedList!!.size){
                var imageView=NiceImageView(this)

                var avatarImgUrl=baseUrl+likedList[i].avatar

                Picasso.get().load(avatarImgUrl).into(imageView)
                var linearLayout=findViewById<LinearLayout>(R.id.liked_container)

                //var params=RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT,ViewGroup.LayoutParams.WRAP_CONTENT)
                var width=ScreenDimen.getInstance(this).pdToPix(42)
                var height=ScreenDimen.getInstance(this).pdToPix(30)
                var padding=ScreenDimen.getInstance(this).pdToPix(3)
                var params=RelativeLayout.LayoutParams(width,height)
                imageView.setPadding(padding,0,padding,0)
                linearLayout.addView(imageView,i,params)
            }

        }
    }

在点赞和取消点赞的时候都调用一下这个函数就可以实现动态更新点赞列表了

这里还有个问题,点击进入帖子详情页,应该先判断一下当前用户是否已经点赞了这个帖子,如果已经点赞了,那么那个按钮应该标记红色,再次点击就是取消点赞。反正就是维护一个liked的布尔型变量,如果点赞了,那初始化liked=true就好了。

==

对于论坛这个我已经不想再纠结了。就先做成这个样子吧,以后有时间再来完善。接下来我可能要试着做一个商城,并且学点架构,比方mvc,mvp之类的,以及网络安全方面的东西。等那些都做好了,我想我就入门了吧!

猜你喜欢

转载自www.cnblogs.com/vocus/p/12640401.html
今日推荐