您的位置:首页 > 其它

创新实训博客(7)——Kotlin的Fragment、Handler、ListView和Adapter配置使用

2020-07-14 06:21 344 查看

Fragment管理

碎片是Android中一个非常重要的部分,我这里的想法是在一个Activity中规定某一个区域,这里可以按照需要显示不同的内容,而Fragment就能很好的实现这个需求。

创建fragment的layout文件和class文件

onCreateView函数,我没有进行修改。

onActivityCreated函数,在这里我是因为要与List进行交互等等操作,因此把操作写在这里。

[code]override fun onActivityCreated(savedInstanceState: Bundle?) {
super.onActivityCreated(savedInstanceState)
fetchData()
mAdapter = ArticleItemAdapter(list, activity)
}

Activity中管理Fragment,首先是初始化

[code]fun managerFragment() {
val transaction = supportFragmentManager.beginTransaction()
transaction.add(R.id.fragment_layout, indexFragment)
transaction.add(R.id.fragment_layout, blogFragment)
transaction.add(R.id.fragment_layout, userFragment)
hideFragment(transaction)
transaction.show(indexFragment)
transaction.commit()
}

然后是根据对应的情况进行切换,使用transaction.show函数。

Bundle进行传值

如果要在Activity和他里面的Fragment之间进行参数传递,需要使用到Bundle。

首先新建bundle对象,并使用put设置参数。

[code]val bundle = Bundle()
bundle.putString("token",getToken())

然后使用arguments赋值,让fragment的arguments是前面有参数的bundle对象。

[code]indexFragment.arguments = bundle

在fragment那边,就获取arguments然后得到对应的内容了。

ListItem类对象

初始化一个类对象,然后设置对应的参数。

[code]class ArticleItem constructor(id: Int) {
var id = 0
init { this.id = id }
}

ListItem的Adapter

两个变量:存放item的列表,上下文。

主要是重写getView函数,具体的操作就是首先获取某个组件,然后进行赋值。

[code]@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = LayoutInflater.from(mContext).inflate(R.layout.item_article, parent, false);
// 获取组件
TextView article_author = (TextView) convertView.findViewById(R.id.item_article_author_name);
// 设置组件内容
article_author.setText(mData.get(position).getAuthor());
return convertView;
}

在Fragment中设置List

需要一个list和一个adapter即可。

list存放数据,adapter用来做对应的点击监听。

遇到的问题(1)——Adapter空指针问题

具体的原因是因为我只是初始化了adapter,但是后期没有进行更新。

我发现这个组件并不能个根据内容的调整而动态的更新,需要手动重新设置。

所以,在添加ListView中的item之前,更新一下adapter的状态。

[code]fun setAdapter() {
mAdapter = ArticleItemAdapter(list, activity)
val listView = activity!!.findViewById<ListView>(R.id.index_blog_list)
listView.adapter = mAdapter
listView.setOnItemClickListener(this)
}

遇到的问题(2)——View的操作问题

只有original的线程可以操作view组件。

我这里的解决方案是使用Handler。

[code]    object : Handler() {
override fun handleMessage(msg: Message) {
super.handleMessage(msg)
if (msg.what == 200) {
setList()
}
}
}

相当于接收消息的时候,开一个新的线程,根据具体的msg的值执行相应的操作。

在我这里当接收到消息200的时候,就会执行对应的操作。

发消息的步骤:

[code]val message = Message()
message.what = 200
handler.sendMessage(message)

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: