美文网首页
ListView的初级使用手记

ListView的初级使用手记

作者: TakeItEasyJQ | 来源:发表于2017-08-14 13:26 被阅读0次

    这只是我在学Android过程中对于所学知识的巩固和方便日后查询的学习笔记,能帮助到有需要的和我一样的初学者就更好了

    首先

    ListView、Adapter、List<objects>是必不可少的 <listView> //此中属性自定 </listView>

    Adapter为ArrayAdapter,默认只能解析List<String>,也就是<listView>中只有一个Textview。

    List集合当然也是String类型的了

    使用时

    private Listview listview;
    private ArrayAdapter adapter; 
    listview=..........;
    adapter=new ArrayAdapter(context,android.R.layout.simple_list_item_1,data); 
    listview.setAdapter(adapter);
    

    context不多说;
    中间为默认加载的item布局;
    data自然是想要解析在ListView中的String类型数据集合了。

    然而

    这种简单的表现显然不能满足每一条中类似新闻的图片、标题、正文并存的情况

    所以

    1、在layout资源文件夹中新建一个布局文件item.xml。此文件中可进行想要的布局排版等;

    2、由于之前ArrayAdapter默认支持String类型而现在item中显然内容丰富,所以要创建一个所要加载的资源的类;比如我想在每一条中显示新闻的标题和摘要,那么

    public class News{      //adapter所要加载的类
        private String title;
        private String content;
        GETTER; SETTER 
    }  
    

    3、新建MyAdapter类继承ArrayAdapter

    public class MyAdapter extends ArrayAdapter<News>{
        private int  resourseId;//用来保存ListView加载的布局的资源id
        public MyAdapter(Context context, int resourse, List<News> objects){
        super(context ,resourse, objects);
        resourseId=resourse;      //从构造函数中获取布局资源id
    }
    
    @override
    public View getView(int position ,View ConverView ,ViewGroup parent){
        News news=getItem(position);
    //个人理解,通过position获取每一条的数据(List<News>中的对应的数据)
        View view=LayoutInflater.from(getcontext).inflate(resourceId ,parent ,false);
        TextView title=......;            TextView content=.....;
        titile.setText(news.getTitle);
        content.setText(news.getContent);
        return view;
    }   
    

    4、最后当然是需要一个保存News类对象的集合

    public static List<News> newsList=new ArrayList();
    //此集合中的数据大多数都是从HttpURLConnection或okHttp中解析出来的数据;
    //只需在解析时不断new出News对象并添加至newsList中即可
    

    优化

    每次用到ListView是都重新加载很显然对于性能来讲是不合适的,所以可以使用getView方法中的ConverView参数(为了避免重复加载布局文件item)和自定义内部类ViewHolder(为了避免重复加载item中的TextView、ImageView等组件)

    public class MyAdapter extends ArrayAdapter{
        private int resourseId;
        public MyAdapter(Context context, int resourse, List objects){
        super(context ,resourse, objects);
        resourseId=resourse;
    }
    
    @override
    public View getView(int position ,View ConverView ,ViewGroup parent){
        View view;   ViewHolder holder;
        News news=getItem(position);
        if(ConverView==null){  //无缓存
        view =LayoutInflater.from(getContext).inflate(resourseId,parent,false);
        holder=new ViewHolder();
        holder.title=(TextView)findViewById(....);
        holder.content=(TextView)findViewById(....);
        view.setTag(holder);     //将holder存于view中
        }else{       //有缓存
        view=ConverView;
        holder=(ViewHolder)view.getTag();  //获取ViewHolder对象
        }
        holder.title.setText(news.getTitle);
        holder.contetn.setText(news.getContent);
        returen view;
    }
    
    class ViewHolder{        //用于缓存控件对象的内部类
        TextView title;
        TextView content;
    }
    

    ListView的点击事件

    ListView的点击事件很容易

    listview.setOnItemClickListener(new AdapterView.onItemClickListener(){
        @override
        public void onItemClick(AdapterView<?> parent ,View view ,int position ,long id){
            //具体的逻辑
        }
    });
    

    ListView的点击只对整个条目有效,无法细分至比如每一条中的ImageView或者TextView去执行不同的点击响应,此实现可有RecyclerView来实现

    注意事项

    从网络解析json或xml内容是由于受到网络情况和机器运行等多种情况的影响可能会报错,错误原因大致为数据发生变化而adapter并未notifyDataChanged;基本就是储存数据的集合并未更新完而执行了ListView的相关显示代码,从而数据不一致导致的;每当从网络加载信息时我都用AsyncTask来解决,当数据加载完毕再执行相关的ListView显示代码即可;

    如有错误欢迎指出

    结束

    相关文章

      网友评论

          本文标题:ListView的初级使用手记

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