效果图
属性值一列下来就是用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的布局

这个在后面适配器那里加载的时候会用在
二.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();这行代码给去掉