ListView的用法+实战


效果图
最终效果图1
属性值一列下来就是用ListView实现的

一.xml文件

1.ListView布局在主xml

 <ListView
         android:id="@+id/staranalysis_lv"
         android:layout_width="match_parent"
         android:layout_height="match_parent"
         android:divider="@null"
         android:dividerHeight="0dp"
         android:scrollbars="none"
         />  

2.额外写一个xml写每个item的布局

![item_star_analysis](https://i.loli.net/2020/07/28/
9et2j5BrVEPDK1N.png)
这个在后面适配器那里加载的时候会用在

二.java代码部分

关于notifyDataSetChanged方法的使用:
notifyDataSetChanged方法强制listview调用getView来刷新每个Item的内容
有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView

正是因为listView有notifDataSetChanged这个方法,所以下面这种代码的写法是可行的

1.ListView适配器的写法

(思路都差不多,在GridView那里已经做了详细说明了)

        public class AnalysisBaseAdapter extends BaseAdapter {
    Context context;
    List<StarAnalysisBean>mData;

    public AnalysisBaseAdapter(Context context, List<StarAnalysisBean> mDatas) {
        this.context = context;
        this.mData=mDatas;
    }


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

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

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

     @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHoder holder=null;
        if(convertView==null){
            //item_star_analysis是单个item布局方式xml文件
            convertView= LayoutInflater.from(context).inflate(R.layout.item_star_analysis,null);
            holder=new ViewHoder(convertView);
            convertView.setTag(holder);
        }
        else {
            holder= (ViewHoder) convertView.getTag();
        }
        StarAnalysisBean bean = mData.get(position);
        holder.titleTv.setText(bean.getTitle());
        holder.contentTv.setText(bean.getContent());
        //改变背景颜色
        holder.contentTv.setBackgroundResource(bean.getColor());
        return convertView;
    }

    class ViewHoder{
        TextView titleTv,contentTv;
        public ViewHoder(View view){
            titleTv=view.findViewById(R.id.itemstat_tv_title);
            contentTv=view.findViewById(R.id.itemstat_tv_content);
        }
    }
 }

下面代码只需要看注释理解就行了,相关核心内容的代码我会在注释前用感叹号标记

2.1方式一 :(先set构造器,再更新数据源)

    //主函数部分
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_star_analysis);
        //获取上级界面传递过来的数据
        Intent intent=getIntent();
        //传过来的是一个类,所以用getSerializableExtra
        bean= (StarBean.StarinfoBean) intent.getSerializableExtra("star");

        //initView的代码我省略了
        initView();
        //!!!!!!!!!!
        mDatas=new ArrayList<>();//初始化显示在ListView上
        adapter=new AnalysisBaseAdapter(this,mDatas);
        analysisLv.setAdapter(adapter);
        //!!!调用函数
        addDataToList();

    }


         //加载ListView当中的数据源内容
    private void addDataToList() {
        //添加数据
        StarAnalysisBean sab1 = new StarAnalysisBean("性格特点:", bean.getTd(), R.color.lightblue);
        StarAnalysisBean sab2 = new StarAnalysisBean("掌管宫位:", bean.getGw(), R.color.lightpink);
        StarAnalysisBean sab3 = new StarAnalysisBean("显阴阳性:", bean.getYy(), R.color.lightgreen);
        StarAnalysisBean sab4 = new StarAnalysisBean("最大特征:", bean.getTz(), R.color.purple);
        StarAnalysisBean sab5 = new StarAnalysisBean("主管星球:", bean.getZg(), R.color.orange);
        StarAnalysisBean sab6 = new StarAnalysisBean("幸运颜色:", bean.getYs(), R.color.colorAccent);
        StarAnalysisBean sab7 = new StarAnalysisBean("搭配珠宝:", bean.getZb(), R.color.colorPrimary);
        StarAnalysisBean sab8 = new StarAnalysisBean("幸运号码:", bean.getHm(), R.color.grey);
        StarAnalysisBean sab9 = new StarAnalysisBean("相配金属:", bean.getJs(), R.color.darkblue);
        mDatas.add(sab1);
        mDatas.add(sab2);
        mDatas.add(sab3);
        mDatas.add(sab4);
        mDatas.add(sab5);
        mDatas.add(sab6);
        mDatas.add(sab7);
        mDatas.add(sab8);
        mDatas.add(sab9);

    //!!!数据源发生变化,提醒适配器更新
        adapter.notifyDataSetChanged();
    }

mDatas最开始是没有数据的,但是因为下面调用addDataToList()提醒适配器更新,所以可以addDataToList()写在后面

2.2方式二(可以这样写但是不推荐):

addDataToList()写在前面设置适配器的前面,在设置适配器的时候顺便就把数据给赋了,但是在addDataToList()中必须把 adapter.notifyDataSetChanged();这行代码给去掉


文章作者: 灿若星河
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 灿若星河 !
评论
  目录