适配器:数据和UI(view)的纽带
我的想法,当你看新闻的时候,不停的向下拉,感觉是无止尽的,如果单靠布局文件里面静态、手动填写是不可能实现的。Android中有几个控件是动态增加的,例如ListView,即视图列表,再加上Adapter,拥有专门修改这种控件内容的功能,通过适配器就实现了动态修改视图控件的能力
实例1:只展示一串字符串
1.定义列表视图ListView
<ListView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/newsList">
</ListView>
2.定义适配器ArrayAdapter
ArrayAdapter
Returns a view for each object in a collection of data objects you provide 返回你提供的数据对象集中的每一个对象的视图
大意是:你提供的数据,适配器用数据修改视图,在视图上展示,返回视图。提供的每一个数据都是这样进行的
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//声明赋值我们要传给ListView列表视图的数据
String[] sl = new String[]{"list1", "list2","list3"};
//引入列表视图对象
ListView listView = (ListView)findViewById(R.id.newsList);
// 给列表视图对象设置一个适配器,传入一个适配器对象,动态更改视图的内容
//这个适配器对象传入三个参数,上下文、第二个是ListView的子视图,
//即单个格子、数据集。也就是动态将每个数据写进列表的单个格子中
listView.setAdapter(new ArrayAdapter<String>(
this, android.R.layout.simple_list_item_1,sl));
}
实例2:给ListView视图列表传入自定义对象,让列表的功能更丰富
一个列表视图ListView是由无数子视图构成,所以我们先构建一个子视图
newlistitem.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/newsTitle"
android:singleLine="true" //只显示一行
android:ellipsize="end" //长度过长,从尾部缩略
android:paddingTop="5dp"
android:paddingBottom="5dp"
/>
</LinearLayout>
然后是用子视图构成的列表视图ListView
activity_main.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ListView
android:id="@+id/newslist"
android:layout_width="match_parent"
android:layout_height="wrap_content">
</ListView>
</LinearLayout>
然后新建新闻类news,用来填充内容到列表视图的子视图中
news.java
public class news {
public String title;
public String content;
public void settitle(String tile){
this.title = tile;
}
public void setcontent(String content){
this.content = content;
}
public String getTitle(){
return title;
}
public String getContent(){
return content;
}
}
接着,创建一个新闻类的适配器,将每一条新闻对象送入视图列表中
newsAdapter.java
public class newsAdapter extends ArrayAdapter<news> {
private int resourceId;
// 构造方法,用于接下来初始化,传入新闻对象
public newsAdapter(@NonNull Context context, int resource, List<news> objects) {
super(context, resource, objects);
resourceId = resource;
}
//每当滑动列表时,被划入到屏幕内的列表子项调用这个方法来填充视图内容
public View getView(int position, View convertView, ViewGroup parent) {
//根据光标所在的位置(类似于列表中的索引),获取(新闻)对象列表中的具体对象
news siglenew = getItem(position);
//用传入的视图去填充视图列表的子项,返回这个列表子项的视图对象
View view = LayoutInflater.from(getContext()).inflate(resourceId, null);
//获取列表子项视图的内容对象并将新闻对象的内容,填充进去
TextView siglenewstitle = (TextView)view.findViewById(R.id.newsTitle);
siglenewstitle.setText(siglenew.getTitle());
return view;
};
}
接下来就是定义很多条新闻(对象),放进一个新闻适配器对象中,将这个适配器对象给视图列表ListView
MainActivity.java
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//视图列表对象
ListView listView = (ListView)findViewById(R.id.newslist);
//初始化新闻对象,并放入新闻列表中
news news1 = new news();
news1.settitle("第一条新闻");
news news2 = new news();
news2.settitle("第二条新闻");
List<news> newslist = new ArrayList<news>();
newslist.add(news1);
newslist.add(news2);
//将新闻列表、视图模板放入适配器,设置好一旦列表子项滑入界面,就将新闻内容填充进视图模板,组成一个子视图返回显示
newsAdapter newsadapter = new newsAdapter(this, R.layout.layout_fragment_newstile, newslist);
listView.setAdapter(newsadapter);
}
https://www.cnblogs.com/devinzhang/archive/2012/01/20/2328334.html
网友评论