当前位置:首页 » 安卓系统 » android复用

android复用

发布时间: 2023-05-21 11:37:05

❶ android中listView怎么复用多种布局

adapter填充数据的时候,我们一般要实现以下方法:
1 public int getCount(){ }
2 public Object getItem(int position) {}
3 public long getItemId(int position) {}
4 public View getView(int position, View view, ViewGroup viewGroup){}

但是要实现复用多种布局的话我们还要实现下面2个方法
1 public int getItemViewType(int position) {}
返回我们要复用的布局类型,假如我们要复用一个tab结构和item结构,我们可以这么来写
类别的数值在(0,类别总数-1)之间

public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;
public static final int TYPE_MAX_COUNT = 3;
@Override
public int getItemViewType(int position) {
//复用tab结构
if (position == 1) {
return TYPE_TAB;
}
//复用一般的item结构
int size = CollectionUtils.size(feedDataList);
if (position >= 1 && size > 0 && position < (size + 2)) {
return TYPE_LIST_ITEM;
}
return TYPE_UNKNOW;
}

类别总数是3,类别对应的int值应该在0 - 2 之间,它们分别是

public static final int TYPE_UNKNOW = 0;
public static final int TYPE_TAB = 1;
public static final int TYPE_LIST_ITEM = 2;

2 public int getViewTypeCount() { } 返回复用布局的总数,这里是3

@Override
public int getViewTypeCount() {
return TYPE_MAX_COUNT;
}

在adapter中的getView方法中,我们就可以这样来写:

@Override
public View getView(int position, View convertView, ViewGroup viewGroup) {
ItemViewHolder itemViewHolder;
TabViewHolder tabViewHolder;
int viewType= getItemViewType(position);
switch (viewType) {
case TYPE_TAB:
if(convertView == null ) {
tabViewHolder = new TabViewHolder(mContext);
//给contenView赋值,并给viewHolder设置tag
tabViewHolder.findView(position,convertView,viewGroup);
}else{
//直接复用
tabViewHolder = (TabViewHolder)convertView.getTag();
}
//这里是处理业务逻辑的方法
tabViewHolder.setView(position);
return tabViewHolder.layout;//返回convertView
case TYPE_LIST_ITEM:
if (convertView == null) {
itemViewHolder = new ItemViewHolder(mContext);
//给contenView赋值,并给viewHolder设置tag
itemViewHolder.findView(position, convertView, viewGroup);
} else {
//convertView不为空,直接复用
itemViewHolder = (ItemViewHolder) convertView.getTag();
}
//处理业务逻辑
itemViewHolder.setView((FeedComment)getItem(position));
return itemViewHolder.layout;//返回convertView
case TYPE_UNKNOW:
return null;
}
return null;
}

说明:处理复用多个布局的时候,如果不调用上面getViewTypeCount()和getItemType(),很容易就出现viewHolder类型转换错误。因为在屏幕滚动的时候,view.getTag()返回的viewHolder有2种,我们拿到的viewHolder可能就不是理想中的viewHolder,这个时候类型转换错误就出现了。

❷ android listview的生命周期,为什么要这样复用,有什么好处

主要是为了减少内存的消耗,如果不进行复用,那么创建一千个Item,就需要实例化1千个实例,会造成内存溢出。目前listview采用的策略是,只显示一屏幕的View,当View超过一屏幕,将其移除后放到最下面进行复用。
好处:减少内存占用,避免内存溢出。
坏处:CPU占用会稍微高点,因为会不断重复Iitem的溢出添加。

❸ android 代码尽可能复用好吗

  1. 在软件开发过程中,程序代码的复用,是非常重要的概念。我核槐们总是需要使用一些现有的模块、包、框架,或开发自己的模块、包、框架,来实现对程序代码的复用。比如在javaWeb编程过程中,经常使用的Struts和Spring等框架,就可以大大简化我们的开改清友发过程,提高开发效率。

  2. 在开发Android应用程序的过程中,同样有这方面的需求。Android系统包含的Android应用程序开发框架正态,已经是一个可以很好的提高开发效率的框架,但它并不能满足我们的所有需要。比如我们再开发某一类应用程序时,会发现这一类应用程序,会有大量的代码是重复的,这时,就需要我们优化设计并采用某种方式,实现重复代码的复用,使开发此类应用程序变得简单。

  3. 类似开发其他Java应用一样,我们可以将可复用的代码,打成一个jar包,供所有需要的项目使用。这样,可以解决很大一部分代码复用的问题,比如在不同应用中可以复用的核心算法等。

  4. 但是,如果可复用代码包含了大量的资源,包括图片、音乐文件甚至界面布局等的时候,代码的复用就会变得麻烦起来,因为这些东西不能被一起打包到jar包里面,供需要的项目使用。而没有这些资源,可复用的代码又无法运行。在这种情况下,最好的解决办法,就是使用Android2.2之后的SDK支持的库项目(Lib Project)。

  5. 一个库项目是一个包含了源码和资源的项目,它可以被其他的项目引用,从而让其他项目使用它包含的代码和资源。多个Android应用程序项目可以引用同一个库项目,同一个Android应用程序项目也可以引用多个库项目。

  6. 创建库项目和引用库项目是很容易的事情。我们以Eclipse环境下的开发为例。如果要创建库项目,只需要在创建普通Android项目完成后,打开设置项目属性的面板,在Android选项卡下选中Is Library复选框即可(如下图所示)。

  7. 现有的项目引用库项目的时候,也只需要打开项目属性设置面板,在Android选项卡下添加需要引用的项目(如下图所示)。

  8. 完成以上操作后,我们就成功的创建了一个库项目,或在现有项目中引用了一个库项目,是不是很简单?

  9. 当然,在使用库项目的时候,因为Android项目结构及编译工具的特殊性,我们需要注意一些要点,列举如下:

  10. 工作项目和库项目的资源名称,尽量不要重复,如果重复,编译器会优先使用工作项目的资源;

  11. 无法将一个库项目导出为一个jar文件;

  12. 库项目的Android系统版本必须等于或低于工作项目的系统版本;

  13. 每一个库项目都会生成一个R文件,工作项目被编译时,将会合并工作项目和库项目的R文件,如果R文件中有常量同名,将使用工作项目R文件中的常量;如果引用了多个库项目,库项目中的R文件有常量重名,将根据库项目被引用的顺序来确定常量的使用优先级。

❹ android中listView怎么复用多种布局

复用多种布局具体是什么样?一般是在item里添加布局盯闷的方式,listview里轮闷一般不做操作,重写Adapter,在里面的getview里获取item的布局,然后可以在里面进行凯桐弯布局的更改。

❺ Android RadioButton复用怎么解决

默认状态不要选中就好了,或者跳转下一个页面时腔型兆伍租候,把之前的选项全部清空。

radioGroup.clearCheck();//清空状态
radioGroup.check(radioButton.getId());//选中状态租厅

❻ android 除了include还有其他复用布局的方法么

尽管Android通过内置了各种各样的控件提供了微小、可复用的交互性元素,也许你需要复用较大的
组件 ---- 某些特定布局文件 。为了更有效率复用的布局文件,你可以使用<include />以及<merge />
标签将其他的布局文件加入到当前的布局文件中。

复用布局文件是一种特别强大的方法,它允许你创建可复用性的布局文件。例如,一个包含“Yse”or“No”的
Button面版,或者是带有文字说明的 Progressbar。复用布局文件同样意味着你应用程序里的任何元素都能从
繁杂的布局文件提取出来进行单独管理,接着你需要做的只是加入这些独立的布局文件(因为他们都是可复用地)。
因此,当你通过自定义View创建独立的UI组件时,你可以复用布局文件让事情变得更简单。

1、创建一个可复用性的布局文件

如果你已经知道复用布局的”面貌”,那么创建、定义布局文件( 命名以”.xml”为后缀)。例如,这里是一个来自
G- Kenya codelab 的布局文件,定义了在每个Activity中都要使用的一个自定义标题 (titlebar.xml):由于这些
可复用性布局被添加至其他布局文件中,因此,它的每个根视图(root View)最好是精确(exactly)的。

[java] view plainprint?
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width=”match_parent”
android:layout_height="wrap_content"
android:background="@color/titlebar_bg">

<ImageView android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:src="@drawable/gafricalogo" />
</FrameLayout>

2、使用<include />标签

在需要添加这些布局的地方,使用<include />标签 。 例如,下面是一个来自G-Kenya codelab的布局文件,
它复用了上面列出的“title bar”文件, 该布局文件如下:

[java] view plainprint?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background="@color/app_bg"
android:gravity="center_horizontal">

<include layout="@layout/titlebar"/>

<TextView android:layout_width=”match_parent”
android:layout_height="wrap_content"
android:text="@string/hello"
android:padding="10dp" />

...

</LinearLayout>

你也可以在<include />节点中为被添加的布局文件的root View定义特别标识,重写所有layout参数即可(任何
以“android:layout_”为前缀的属性)。例如:

[java] view plainprint?
<include android:id=”@+id/news_title”
android:layout_width=”match_parent”
android:layout_height=”match_parent”
layout=”@layout/title”/>

3、使用<merge />标签

当在布局文件中复用另外的布局时, <merge />标签能够在布局层次消除多余的视图元素。例如,如果你的
主布局文件是一个垂直地包含两个View的LinearLayout,该布局能够复用在其他布局中,而对任意包含两个View的
布局文件都需要一个root View(否则, 编译器会提示错误)。然而,在该可复用性布局中添加一个LinearLayout
作为root View,将会导致一个垂直的LinearLayout包含另外的垂直LinearLayout。内嵌地LinearLayout只能减缓
UI效率,其他毫无用处可言。
该复用性布局利用.xml呈现如下:

[java] view plainprint?
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width=”match_parent”
android:layout_height=”match_parent”
android:background="@color/app_bg"
android:gravity="horizontal">

<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>

<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>
</LinearLayout>

为了避免冗余的布局元素,你可以使用<merge />作为复用性布局文件地root View 。例如:
使用<merge />标签的布局文件:

[java] view plainprint?
<merge xmlns:android="http://schemas.android.com/apk/res/android">

<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/add"/>

<Button
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:text="@string/delete"/>

</merge>

现在,当你添加该布局文件时(使用<include />标签),系统忽略< merge />节点并且直接添加两个Button去
取代<include />节点。

❼ Android-Bitmap复用时内存大小计算

主要是Bitmap的这两个方法得到的Bitmap的值,会在内存复用体现。
如果不使用内存复用,这两个方法是一样的效果。

在通过复用 Bitmap 来解码图片时,那么 getByteCount() 表示新解码图片占用内存的大 小,getAllocationByteCount() 表示被复用 Bitmap真实占用的内存大小。
比如:上面的图片,黑色区域是当前Bitmap对象实际内存占用大小,但是这部分内存中,只有红色区域是新占用的,而其他的区域是可以复用的但是没被复用(即Bitmap中新的图片只是占用了8个大小,但是Bitmap实际大小其实是有20),那么如果使用getByteCount()就只会返回被复用区域的内存大小,所以使用getByteCount()返回内存区域的大小,其实是小于等于实际大小的。
以为你Bitmap占用内存大小,是由最大的图片来决定的,如果放入一张更小的图片,其实并不会减少Bitmap占用的内存大小。
可以认为:
getByteCount()只是图片的大小
getAllocationByteCount()是Bitmap的大小
因为Bitmap可以复用,所以Bitmap可以放入不同的图片,当Bitmap放入更大的图片的时候,就会占用更大的内存,但是这个时候如果对Bitmap对象进行复用,放入一张小图片,并不会改变Bitmap的大小。

❽ 如何将android项目的图片等资源文件打包复用

可以将资源做成一个APK
然后在需要调用的application中使用createPackageContext方法获取资源APK的Context 然后就可以访问

❾ 【Android开发】ListView适配器BaseAdapter的getView复用问题

解扒拆决方法:1、取消复用,就是那个判断语句。(最简单的方法,列表数据过多不建议使肢此燃用历虚)
2、为每个item布局添加tag
3、用一个数组变量保存选中状态,通过保存的状态判断选中。(我常用的方法)

热点内容
超内核源码 发布:2025-02-13 02:12:54 浏览:443
趣粉脚本 发布:2025-02-13 02:11:23 浏览:951
压缩的茶叶怎么弄开 发布:2025-02-13 02:11:16 浏览:738
n1ftp服务器 发布:2025-02-13 02:10:39 浏览:347
没有卡没有密码怎么办啊 发布:2025-02-13 01:51:53 浏览:460
linux2个ftp服务器 发布:2025-02-13 01:44:31 浏览:14
戴尔r730网络配置后如何保存 发布:2025-02-13 01:38:27 浏览:344
php用什么编译 发布:2025-02-13 01:37:12 浏览:703
手机缓存的文件路径是在哪 发布:2025-02-13 01:34:58 浏览:563
oppo手机密码哪里设置 发布:2025-02-13 01:30:38 浏览:683