Adapter

2018-09-19  本文已影响0人  勤学奋进小郎君

适配器:数据和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

上一篇下一篇

猜你喜欢

热点阅读