Adapter

作者: 勤学奋进小郎君 | 来源:发表于2018-09-19 01:11 被阅读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

    相关文章

      网友评论

          本文标题:Adapter

          本文链接:https://www.haomeiwen.com/subject/kliggftx.html