博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
省去 ListView 滚动条 显示全部内容
阅读量:5793 次
发布时间:2019-06-18

本文共 3014 字,大约阅读时间需要 10 分钟。

引用:

  如果你想在ScrollView中包含ListView而产生了疑问,百思不得其解,那么,很可能就百度亦不得其解,Google仍不得其解了,你会在寻求答案的过程中,体会到众说纷纭是个什么涵义了。

  ListView本身就有滚动属性,会跟ScrollView冲突。所以,有人提到自定义功能,并且给出了实现方式;有人会提议换一种实现方式,避免一起使用;有人就更强硬,不能这么用。

  如果是自定义功能的话,这么多控件放在这里,动不动就自定义,虽然已经被人实现了,还是不免为搁置了那么多控件而不甘;如果是换一种方式去布局,要真是能够轻易实现,就不必为此大费周折来思考同时使用了;要说不能用,那只是需求没到,要真是这种方式最符合需求,虽说强扭的瓜不甜,呵呵,就是生的也得吃喽。

  如果,有人使用过Google的Market,那么,对这个两个界面应该比较熟悉:这是Apk文件的详细介绍界面,中间关于开发者介绍的截图。  2011050716055051.png2011050716123869.png

  操作过程中会发现,“About the developer”下属的三项内容,非常符合ListView的属性,点击进入对应功能页面,长按弹出模糊选项框(后面截图是下面内容长按弹出的,性质一样的)等功能。

   而且,中间部分整个布局是可以拖动的,明显ScrollView的性质。这就不能不让我硬着头皮来看是否能在ScrollView中使用ListView的可能性了。

   在查看了大量资料后,终于,让我得到了一个可以接受的结论:

  在ListView内容寥寥可数,而且选项操作是固定的情况下,是可以通过设置它的高度,让它“放弃”自身滚动属性,而放置到ScrollView中使用的。

  因为,不“放弃”自身滚动属性,就会出现:前面提到的三项内容,只能显示出一项多出来,拖动它的话,会滚动出现其他内容,也可以说是滚动中的滚动了。

  显然,Market中开发者的内容是固定的,而且,点击后的操作也是固定的,符合条件。

  当然,还是需要添加一些其他处理了:

  一、获取并设置ListView内容的高度:

private
void
setListViewHeight(ListView lv) {
ListAdapter la
=
lv.getAdapter();
if
(
null
==
la) {
return
;
}
//
calculate height of all items.
int
h
=
0
;
final
int
cnt
=
la.getCount();
for
(
int
i
=
0
; i
<
cnt; i
++
) {
View item
=
la.getView(i,
null
, lv);
item.measure(
0
,
0
);
h
+=
item.getMeasuredHeight();
}
//
reset ListView height
ViewGroup.LayoutParams lp
=
lv.getLayoutParams();
lp.height
=
h
+
(lv.getDividerHeight()
*
(cnt
-
1
));
lv.setLayoutParams(lp);
}

  二、通过设置标签,来响应具体操作:

  1.定义标签,及点击后的处理方法

//
developer information
private
final
static
String DEV_TAG_ID
=
"
developer_id
"
;
private
final
static
String DEV_TAG_HP
=
"
developer_home_page
"
;
private
final
static
String DEV_TAG_EM
=
"
developer_email
"
;
private
void
developerItemClick(String tag) {
if
(DEV_TAG_ID.equals(tag)) {
//
display list of developer's apks
}
else
if
(DEV_TAG_HP.equals(tag)) {
//
visit developer's home page
}
else
if
(DEV_TAG_EM.equals(tag)) {
//
send mail to developer
}
}

  2.监听ListView点击设置

final
DevAdapter adapter
=
new
DevAdapter(ApkInfo.
this
, listItem, tags,
R.layout.developer_item, from, to);
devInfoLv.setAdapter(adapter);
devInfoLv.setOnItemClickListener(
new
OnItemClickListener() {
public
void
onItemClick(AdapterView
<?>
parent, View view,
int
position,
long
id) {
developerItemClick(adapter.getItemTag(position));
}
});
setListViewHeight(devInfoLv);

  3.自定义DevAdapter,主要添加了存储tags内容和获取点击项tag内容,以确定点击操作,供 2 使用。

public
class
DevAdapter
extends
SimpleAdapter {
private
String[] tags;
public
DevAdapter(Context context, List
<?
extends
Map
<
String,
?>>
data,
ArrayList
<
String
>
tags,
int
resource, String[] from,
int
[] to) {
super
(context, data, resource, from, to);
int
size
=
tags.size();
this
.tags
=
new
String[size];
for
(
int
i
=
0
; i
<
size; i
++
) {
this
.tags[i]
=
tags.get(i);
}
}
public
String getItemTag(
int
position) {
return
this
.tags[position];
}
。。。 。。。
}

  4.添加ListView项时,对应添加tag到tags中

ArrayList
<
String
>
tags
=
new
ArrayList
<
String
>
();
//
如果id存在
tags.add(DEV_TAG_ID);
//
如果主页存在
tags.add(DEV_TAG_HP);
//
如果邮箱存在
tags.add(DEV_TAG_EM);
注意:listView中的adapter里的getview中的view,只能是单个view  或是线性布局,不能为相对布局(可把相对布局放在线性布局中).

转载地址:http://bnffx.baihongyu.com/

你可能感兴趣的文章
java中ArrayList 、LinkList区别
查看>>
Spring ’14 Wave Update: Installing Dynamics CRM on Tablets for Windows 8.1
查看>>
利用rand7()构造rand10()
查看>>
MySQL 备份与恢复
查看>>
吃午饭前,按书上的代码写会儿--Hunt the Wumpus第一个版本
查看>>
easyui中combobox的值改变onchang事件
查看>>
TEST
查看>>
PAT A1037
查看>>
ReactiveSwift源码解析(三) Signal代码的基本实现
查看>>
(六)Oracle学习笔记—— 约束
查看>>
[Oracle]如何在Oracle中设置Event
查看>>
top.location.href和localtion.href有什么不同
查看>>
02-创建hibernate工程
查看>>
Open Graph Protocol(开放内容协议)
查看>>
Ubuntu18.04中配置QT5.11开发环境
查看>>
Exception的妙用
查看>>
知识图谱在互联网金融中的应用
查看>>
MySQL 到底能不能放到 Docker 里跑?
查看>>
【docker】关于docker 中 镜像、容器的关系理解
查看>>
information_schema系列五(表,触发器,视图,存储过程和函数)
查看>>