导航:首页 > 方法技巧 > android如何添加适配器的方法

android如何添加适配器的方法

发布时间:2022-08-18 05:14:57

⑴ android 怎么给headerview添加适配器

首先是RecyclerView的ViewHolder(这里面的方法可以根据自己需要进行添加)

importandroid.graphics.Bitmap;
importandroid.graphics.drawable.Drawable;
importandroid.os.Build;
importandroid.support.v7.widget.RecyclerView.ViewHolder;
importandroid.text.Spanned;
importandroid.util.SparseArray;
importandroid.view.View;
importandroid.view.animation.AlphaAnimation;
importandroid.widget.Checkable;
importandroid.widget.CheckedTextView;
importandroid.widget.ImageView;
importandroid.widget.TextView;{
privateSparseArraymViews;
privateViewmConvertView;
publicBaseHolder(ViewmConvertView){
super(mConvertView);
this.mConvertView=mConvertView;
this.mViews=newSparseArray<>();
}publicTgetView(intviewId){
Viewview=mViews.get(viewId);
if(null==view){
view=mConvertView.findViewById(viewId);
mViews.put(viewId,view);
}
return(T)view;
}
/**
*设置TextView的内
*
*@paramviewId控件id
*@paramtext文本内容
*@returnViewHolder
*/
publicBaseHoldersetText(intviewId,Stringtext){
TextViewview=getView(viewId);
view.setText(text);
returnthis;
}
/**
*设置TextView的内
*
*@paramviewId控件id
*@paramspanned文本内容
*@returnBaseHolder
*/
publicBaseHoldersetText(intviewId,Spannedspanned){
TextViewview=getView(viewId);
view.setText(spanned);
returnthis;
}
/**
*设置TextView的内
*
*@paramviewId控件id
*@paramresId资源文件中的id
*@returnBaseHolder
*/
publicBaseHoldersetText(intviewId,intresId){
TextViewview=getView(viewId);
view.setText(resId);
returnthis;
}
/**
*@paramviewId控件id
*@paramresId资源文件中的id
*@returnBaseHolder
*/
(intviewId,intresId){
ImageViewview=getView(viewId);
view.setImageResource(resId);
returnthis;
}
/**
*@paramviewId控件id
*@parambitmap图片的的Bitmap
*@returnBaseHolder
*/
(intviewId,Bitmapbitmap){
ImageViewview=getView(viewId);
view.setImageBitmap(bitmap);
returnthis;
}
/**
*@paramviewId控件id
*@paramdrawable图片的的Drawable
*@returnBaseHolder
*/
(intviewId,Drawabledrawable){
ImageViewview=getView(viewId);
view.setImageDrawable(drawable);
returnthis;
}
/**
*给控件设置tag
*
*@paramviewId控件id
*@paramobjtag
*@returnViewHolder
*/
publicBaseHoldersetTag(intviewId,Objectobj){
Viewview=getView(viewId);
view.setTag(obj);
returnthis;
}
/**
*给控件设置OnClickListener
*
*@paramviewId控件id
*@paramlistener点击事件
*@returnViewHolder
*/
(intviewId,View.OnClickListenerlistener,Objecttag){
Viewview=getView(viewId);
view.setOnClickListener(listener);
view.setTag(tag);
returnthis;
}
/**
*给控件设置OnClickListener
*
*@paramviewIds控件ids
*@paramlistener点击事件
*@returnViewHolder
*/
(View.OnClickListenerlistener,Objecttag,int...viewIds){
for(intviewId:viewIds){
Viewview=getView(viewId);
view.setTag(tag);
view.setOnClickListener(listener);
}
returnthis;
}
/**
*设置选中
*
*@paramchecked是否选择
*@paramviewIdsview的Id
*@returnBaseHolder
*/
publicBaseHoldersetChecked(booleanchecked,int...viewIds){
for(intviewId:viewIds){
Checkableview=getView(viewId);
view.setChecked(checked);
}
returnthis;
}
/**
*设置view可见
*
*@paramvisible是否看见
*@paramviewIdsview的Id
*@returnBaseHolder
*/
publicBaseHoldersetVisibility(booleanvisible,int...viewIds){
for(intviewId:viewIds){
setVisible(viewId,visible);
}
returnthis;
}
publicBaseHoldersetVisible(intviewId,booleanvisible){
Viewview=getView(viewId);
view.setVisibility(visible?View.VISIBLE:View.GONE);
returnthis;
}publicBaseHoldersetAlpha(floatvalue,int...viewIds){
for(intviewId:viewIds){
setAlpha(viewId,value);
}
returnthis;
}
publicBaseHoldersetAlpha(intviewId,floatvalue){
if(Build.VERSION.SDK_INT>=Build.VERSION_CODES.HONEYCOMB){
getView(viewId).setAlpha(value);
}else{
AlphaAnimationalpha=newAlphaAnimation(value,value);
alpha.setDuration(0);
alpha.setFillAfter(true);
getView(viewId).startAnimation(alpha);
}
returnthis;
}
publicBaseHoldersetImageLevel(intviewId,intlevel){
ImageViewview=getView(viewId);
view.setImageLevel(level);
returnthis;
}
publicBaseHoldersetSelected(intviewId,booleanselected){
CheckedTextViewview=getView(viewId);
view.setSelected(selected);
returnthis;
}
}

然后就是关键的Adapter了

packagecom.retail.wumartmms.adapter;
importandroid.support.v7.widget.GridLayoutManager;
importandroid.support.v7.widget.RecyclerView;
importandroid.support.v7.widget.StaggeredGridLayoutManager;
importandroid.view.LayoutInflater;
importandroid.view.View;
importandroid.view.ViewGroup;
importcom.retail.wumartmms.utils.ArrayUtil;
importcom.retail.wumartmms.utils.CommonUtils;
importjava.util.ArrayList;
importjava.util.List;
.Adapter{
publicstaticfinalintTYPE_HEADER=0;
publicstaticfinalintTYPE_NORMAL=1;
protectedintlayoutId;
protectedListmDatas;
protectedViewmHeaderView;
protectedViewemptyView,networkView;
publicLBaseAdapter(intlayoutId){
this.mDatas=newArrayList<>();
this.layoutId=layoutId;
}
publicvoidsetHeaderView(ViewheaderView){
mHeaderView=headerView;
notifyItemInserted(0);
}
publicViewgetHeaderView(){
returnmHeaderView;
}
publicvoidaddItems(Listitems){
if(ArrayUtil.isNotEmpty(items)){
intoldCont=mDatas.size();
mDatas.addAll(items);
if(oldCont==0){
notifyDataSetChanged();
}else{
notifyItemRangeChanged(oldCont,mDatas.size());
}
}
}
publicvoidaddItem(Titem){
mDatas.add(item);
notifyDataSetChanged();
}
publicvoidaddItems(Listitems,booleanisRefresh){
if(isRefresh){
mDatas.clear();
notifyDataSetChanged();
}
addItems(items);
}
publicvoidshowEmptyView(){
if(null!=networkView)
networkView.setVisibility(CommonUtils.isNetworkAvailable(networkView.getContext())?View.GONE:View.VISIBLE);
if(null!=emptyView){
if(null!=networkView&&networkView.getVisibility()==View.VISIBLE){
emptyView.setVisibility(View.GONE);
return;
}
emptyView.setVisibility(isEmpty()?View.VISIBLE:View.GONE);
}
}@Override
publicintgetItemViewType(intposition){
if(mHeaderView==null)returnTYPE_NORMAL;
if(position==0)returnTYPE_HEADER;
returnTYPE_NORMAL;
}
@Override
(ViewGroupparent,finalintviewType){
if(mHeaderView!=null&&viewType==TYPE_HEADER)
returnnewBaseHolder(mHeaderView);
ViewmView=LayoutInflater.from(parent.getContext()).inflate(layoutId,parent,false);
BaseHolderbaseHolder=newBaseHolder(mView);
baseHolder.itemView.setOnClickListener(newView.OnClickListener(){
@Override
publicvoidonClick(Viewview){
ObjectvTag=view.getTag();
if(vTag!=null&&vTaginstanceofInteger)
onItemClick(mDatas.get(Integer.valueOf(vTag.toString())));
}
});
returnbaseHolder;
}
protectedvoidonItemClick(Tt){
}
@Override
publicvoidonBindViewHolder(BaseHolderbaseHolder,intposition){
if(getItemViewType(position)==TYPE_HEADER)return;
intpos=getRealPosition(baseHolder);
baseHolder.itemView.setTag(pos);
onBind(baseHolder,pos,mDatas.get(pos));
}
@Override
(RecyclerViewrecyclerView){
super.onAttachedToRecyclerView(recyclerView);
RecyclerView.LayoutManagermanager=recyclerView.getLayoutManager();
if(){
=((GridLayoutManager)manager);
gridManager.setSpanSizeLookup(newGridLayoutManager.SpanSizeLookup(){
@Override
publicintgetSpanSize(intposition){
returngetItemViewType(position)==TYPE_HEADER
?gridManager.getSpanCount():1;
}
});
}
}
@Override
(BaseHolderbaseHolder){
super.onViewAttachedToWindow(baseHolder);
ViewGroup.LayoutParamslp=baseHolder.itemView.getLayoutParams();
if(lp!=null
&&.LayoutParams
&&baseHolder.getLayoutPosition()==0){
StaggeredGridLayoutManager.LayoutParamsp=(StaggeredGridLayoutManager.LayoutParams)lp;
p.setFullSpan(true);
}
}
publicintgetRealPosition(RecyclerView.ViewHolderholder){
intposition=holder.getLayoutPosition();
returnmHeaderView==null?position:position-1;
}
@Override
publicintgetItemCount(){
returnmHeaderView==null?mDatas.size():mDatas.size()+1;
}
publicabstractvoidonBind(BaseHolderbaseHolder,intrealPosition,Tt);
publicbooleanisEmpty(){
returnArrayUtil.isEmpty(mDatas);
}
publicvoidsetEmptyView(ViewemptyView){
this.emptyView=emptyView;
}
publicTgetItem(intposition){
returnmDatas.get(position);
}
publicvoidsetNetworkView(ViewnetworkView){
this.networkView=networkView;
}
}

⑵ listview适配器如何实现

创建继承BaseAdapter并实现其抽象方法的类MyListViewAdapter
说明
下面的讲解中,只创建自定义的适配器类,如何使用请参考android中常用控件的使用之ListView
1.创建类MyListViewAdapter
创建类MyListViewAdapter,该类继承BaseAdapter,并实现其抽象方法:
1
2
3
4

int getCount();
Object getItem(int position);
long getItemId(int position);
View getView(int position,View convertView,ViewGroup parent);

getCount需要返回有多少个item,也就是说最会在listview中展示这么多行
getItem需要返回参数position位置的数据
getItemId返回position就行了
2.给MyListViewAdapter类添加成员变量和构造方法
两个成员变量
1
2

List<String> list;
Context context;

list表示要显示的数据,context变量在生成View对象时需要用到
构造方法:构造方法是为了给两个成员变量赋值
1
2
3
4

public MyListViewAdapter(List<String> list , Context context) {
this.list = list;
this.context = context;
}

3.给getCount,getItem,getItemId方法添加代码
getCount需要返回有多少个item,也就是说最会在listview中展示这么多行,所以返回list.size
getItem需要返回参数position位置的数据,也就是list中第position项的值list.get(position)
getItemId返回position就行了
1
2
3
4
5
6
7
8
9
10
11
12
13
14

@Override
public int getCount() {
return list.size();
}

@Override
public Object getItem(int position) {
return list.get(position);
}

@Override
public long getItemId(int position) {
return position;
}

4.给getView方法添加代码
getView方法是返回位置为position的View对象,第二个参数convertView考虑到资源重用问题,在上下滑动的过程中,需要显示某项的时候才会调用getView方法,而如果有某项被隐藏不显示,就会把不显示那一行的View作为convertView参数传入,如果没有某项被隐藏,convertView值为null。可以通过下面代码中的if(convertView!=null)中的输出来看哪一行被隐藏了。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23

@Override
public View getView(int position, View convertView, ViewGroup parent) {
System.out.println("调用getView方法,显示position="+position+"项");
if(convertView!=null){
TextView t = (TextView) convertView.findViewById(R.id.firstTextView);
System.out.println(t.getText());
}else{
LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
convertView = layoutInflater.inflate(R.layout.item_mylistviewadapter, null);
}
TextView t = (TextView)(convertView.findViewById(R.id.firstTextView));
t.setText(list.get(position));
if(position%2==0)
{
t.setBackgroundColor(Color.WHITE);

}
else{
t.setBackgroundColor(Color.GRAY);
}
return convertView;
}

补充:通过xml生成View对象
通过Context对象生成一个LayoutInflater对象
调用LayoutInflater对象的inflate方法生成控件对象,inflate方法的第一个参数为xml文件,第二个参数一般为null。返回值为该xml文件最外层的标签对象。
1
2

LayoutInflater layoutInflater =(LayoutInflater)context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
LinearLayout convertView =(LinearLayout)layoutInflater.inflate(R.layout.item_mylistvie

源代码下载
pan..com/s/1ntuQDdv

⑶ android的listview中用自定义适配器时定义复杂底层数据类型怎么定义

方法/步骤

1

首先将适配器的View视图表现出来,使用ListView为例,代码如下。

⑷ android适配器怎样进行数据适配

顾名思义,就是把一些数据给弄得适当,适合以便于在View上显示。适配器就像显示器,把复杂的东西按人可以接受的方式来展现。也可以这样来理解适配器,ListView通过适配器,理解我们要对ListView里加入什么内容,而我们在适配器里@Override的方法,就是让我们写上我们要告诉这个ListView的一些基本内容。
可以说适配器就是数据和视图之间的桥梁,学好适配器还是非常重要的。

让我们先从各个方面理解适配器,然后看一些例子我想应该就可以彻底掌握它了!

适配器的工作原理:
适配器是怎么处理得到的数据,并把它显示出来的呢?其实很简单,说白了适配器它也是一个类,在类里面它实 现了父类的这几个方法:
public int getCount() //得到数据的行数
public Object getItem(int position) //根据position得到某一行的记录
public long getItemId(intposition) //的到某一条记录的ID
还有最重要的:
publicView getView(intposition, View convertView, ViewGroup parent)
//相比于其它几个方法这个方法是最重要的,它显式的定义了适配器将要以什么样的方式去显示我们所 填充的数据,在自定义的适配器里面我们通常会给它写个布局文件。
这些在最后的一两个例子里会仔细讲解,我们从简单的看起:首先看看常用的适配器

我们常用的适配器一共有三个,当然不包含自定义的适配器:就是ArrayAdapter,SimpleAdapter,SimpleCursorAdapter 这三个,他们都是继承于BaseAdapter 。

下面我会逐一介绍,我们在具体应用中来继续学习Adapter:
说道Adapter不得不说道ListView,或者说用到ListView不得不提到Adapter
在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。
而列表的显示需要三个元素:
1.ListVeiw 用来展示列表的View。
2.适配器 用来把数据映射到ListView上的中介。
3.数据 具体的将被映射的字符串,图片,或者基本组件。

根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter
其中以ArrayAdapter最为简单,只能展示一行字。SimpleAdapter有最好的扩充性,可以自定义出各种效果。SimpleCursorAdapter可以认为是SimpleAdapter对数据库的简单结合,可以方面的把数据库的内容以列表的形式展示出来

我们从最简单的ListView开始(ArrayAdapter):

我打算把这几种适配器的例子放在一个app里面,然后上传到我的资源,再分享链接给大家。所以我打算由MainActivity里的Button来跳转到各个例子,现在让我们一步步的把这个Demo写出来。

项目开始啦!

(1)首先,新建一个app ,名字叫做 AdapterDemo ,先在activity_main.xml里添加一个button,一会跳转的时候使用。

(2)然后新建一个类ArrayAdapterDemo继承自Activity作为我们第一个小例子的Activity,@Override 我们的onCreate方法
新建一个xml文件arrayadapterdemo.xml作为我们的布局文件,其中包含一个文本域和一个ListView,代码如下:
arrayadapterdemo.xml:
?

1
2
3
4
5
6
7
8
9
10

<!--?xml version="1.0" encoding="utf-8"?-->
<linearlayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical">

<textview android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="这是ArrayAdapter的一个例子">
</textview>

<listview android:id="@+id/arrayadapterdemolistview" android:layout_width="wrap_content" android:layout_height="wrap_content">
</listview>

</linearlayout>

(3)然后回到ArrayAdapterDemo,定义一个Listview暂且叫做lv,并且lv=(ListView)findViewById(R.id.arrayadapterdemolistview); ,setContentView()为刚才的xml布局,然后为lv设置一个适配器,这里使用的是安卓原生的ArrayAdapter(Context context, inttextViewResourceId, List objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器 来两者的适配工作。
ArrayAdapter的构造需要三个参数,依次为:this,布局文件(注意这里的布局文件描述的是列表的每一行的布局, android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完 成适配的最后工作。
一般写一个getData()方法来作为最后一个参数,最终代码如下:

?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36

package com.example.adapterdemo;

import java.util.ArrayList;
import java.util.List;
import android.app.Activity;
import android.os.Bundle;
import android.widget.ArrayAdapter;
import android.widget.ListView;

public class ArrayAdapterDemo extends Activity {
private ListView lv;

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.arrayadapterdemo);
lv=(ListView)findViewById(R.id.arrayadapterdemolistview);
lv.setAdapter(new ArrayAdapter<string>(this,
android.R.layout.simple_expandable_list_item_1, getData()));
}

public List<string> getData(){

List<string> data = new ArrayList<string>();
data.add("测试数据1");
data.add("测试数据2");
data.add("测试数据3");
data.add("测试数据4");

return data;

}

}
</string></string></string></string>

再在AndroidManifest.xml中注册Activity并在主界面中完成button监听跳转就可以了。

⑸ android 中怎么自定义个适配器

自定义适配器只需要自己新建一个类继承自baseadapter就可以了。

⑹ android spinner自定义适配器怎么添加头部

自定义适配器中LayoutInflater的使用
在实际开发中LayoutInflater这个类还是非常有用的,它的作用类似于findViewById()。不同点是LayoutInflater是用来找res/layout/下的xml布局文件,并且实例化;而findViewById()是找xml布局文件下的具体widget控件(如Button、TextView等)。
具体作用:
1、对于一个没有被载入或者想要动态载入的界面,都需要使用LayoutInflater.inflate()来载入;
2、对于一个已经载入的界面,就可以使用Activiyt.findViewById()方法来获得其中的界面元素。
使用LayoutInflater有两种方法:
方法一:
[java] view plain
private LayoutInflater listContainer ; // 视图容器
listContainer = LayoutInflater. from (context); // 创建视图容器并设置上下文
convertView = listContainer .inflate(R.layout. list_item , null ); // 获取list_item布局文件的视图
方法一:
[java] view plain
private LayoutInflater inflater ;
inflater = (LayoutInflater) context.getSystemService(Context. LAYOUT_INFLATER_SERVICE );
convertView = inflater .inflate( R.layout. list_item , null ); //生成条目界面对象

⑺ android自定义适配器怎么写

自定义适配器如下:
public
class
ImageAdapter
extends
BaseAdapter{
public
int
res[];
private
Context
context;
public
ImageAdapter(int
res[],Context
context){
this.res=res;
this.context=context;
}
@Override
//返回已定义数据源总数量
public
int
getCount()
{
//
TODO
Auto-generated
method
stub
return
res.length;
}
@Override
//告诉适配器取得目前容器中的数据对象
public
Object
getItem(int
position)
{
//
TODO
Auto-generated
method
stub
return
position;
}
@Override
//告诉适配器取得目前容器中的数据ID
public
long
getItemId(int
position)
{
//
TODO
Auto-generated
method
stub
return
position;
}
@Override
//取得当前欲显示的图像View
public
View
getView(int
position,
View
convertView,
ViewGroup
parent)
{
//
TODO
Auto-generated
method
stub
ImageView
image=new
ImageView(context);
image.setBackgroundResource(res[position]);
image.setLayoutParams(new
Gallery.LayoutParams(400,300));
image.setScaleType(ScaleType.FIT_XY);
return
image;
}
}

⑻ android 怎么给适配器页面传数据

使用同步适配器(sync adapter)传输数据

在android设备与web服务器之间实现数据同步能显着提高你的应用的实用性,让你的应用更受用户的欢迎。比如说,你的数据上传给web服务器,这就有了一个实用的备份。当用户的设备离线工作时,这时从服务器下载输数据是很有用的。有些情况下,用户可能会觉得通过网页的同步接口来输入或编辑数据更方便,因为这些数据很快就从同页上同步过来了,他们也可能想在一段时间内采集数据然后再将数据上传到中央存储区。

尽管你可以自己为你的应用设计一套数据传输系统, 你仍应该考虑使用Android的Sync adapter framework(m同步适配器框架)。这个框架能帮你自动管理数据传输以及多个不同应用之间的相应的同步操作。借助这个框架,你可以使用以下几个功能,而这些功能不适用于你自己设计的数据传输方案。

插件结构
允许你以可调用控件的形式来向系统添加数据传输代码。

自动化操作
允许你基于大量的标准之上进行数据自动传输,其中包括数据修改,运行时间以及当天的时间。另外,你可在系统里添加数据传输代码,这些代码无法在队列里运行。当需要的时候,它们就会被运行。

网络自动检查
当你的设备有网络连接时,系统才会传输数据。

提高电池性能
你可以在一个位置来集成管控你所有应用的数据传输任务,保证了它们都在同一时间被执行。同样,你应用的数据传输和其它应用的数据传输也被限定连在一起了。这些特性能够减少你的系统在网络上切换的次数,也就减少了电池的消耗。

帐户的管理和认证
如你的应用有需要用户的证书或服务器的登录,你可以很随意将帐户的管理和认证集成到你的数据传输中。

这个类展示了如何创建一个同步适配器和bound service,其中bound service 包裹着适配器。如何提供一些组件能够帮助你将sync adapter 集成到框架里,如何用各种方式运行同步适配器(sync adapter)。

注意:同步适配器可以异步工作。所以使用前你要先知道它们是定期而有效地传输数据,而不是即时地。如果你需要即时传输数据,应该在AsyncTask或IntetentService里操作。

教程
创建一个根认证器
学习如何添加一个帐户处理组件,满足同步适配器的需要,成为你app的一部分。这个教程会向你展示怎样简单地创建一个根验证器。

创建根Content provider
学习如何添加一个content provider, 满足同步适配器的需要,成为你app的一部分。这节教程假设你的应用没有使用content provider, 这里会你演示怎么创建这个根组件。如果你的应用已经使用了content provider, 请忽略这部分。

创建同步适配器(sync adapter)
学习如何将你的数据传输代码封装到你的组件,使同步适配器框架(sync adapter framework)可以自动运行。

运行同步适配器(sync adapter)
学习如何使用同步适配器框架(sync adapter framewrok)来触发和安排你的数据传输。

阅读全文

与android如何添加适配器的方法相关的资料

热点内容
ppt中处理图片的方法 浏览:857
月环食天象观测方法有哪些 浏览:122
铝镁墙面安装方法 浏览:171
泰州垫层钢筋计算方法 浏览:84
小米手机的视频位置在哪里设置方法 浏览:833
传统肿瘤治疗方法 浏览:87
功放机的使用方法和使用步骤 浏览:473
扣板灯开关安装方法 浏览:154
橱柜转角角条卡槽安装方法 浏览:362
交变盐雾检测方法 浏览:868
汽车中控声音变差解决方法 浏览:902
取料方法有哪些 浏览:135
下一秒变身的正确方法 浏览:575
上鱼最佳打底方法 浏览:973
脑瘫腘绳肌最好的锻炼方法 浏览:985
床的简便方法怎么画 浏览:464
儿童4层置物架安装方法 浏览:787
水泵轴承安装的正确方法 浏览:231
腰往上抬的正确方法 浏览:520
药用植物园科普研究方法 浏览:431