spring的aop是什么它的关键词有哪些
我给你来个权威的,你答到这下面就基本不问了。IOC(反转控制):对成员变量的赋值的控制权从代码中反转到配置文件中。AOP:Aspect(切面)Oriented(面向)Programming(编程),面向切面编程。差不多就够了,再看就是Spring的事务处理,基本就这些。
关于android中expandablelistview添加数据的办法
一。 前言 因为项目的需要,开始学习android开发,是做一个类似于谷歌自带的浏览器,当做到下载管理页面的时候,ExpandableListview如何动态更新把我给难住了。后来通过大量的上网查资料,编码实践终于找到了解决办法。现在把方法与大家共同探讨学习。由于本人还是小菜鸟,文中肯定会出现一些低级错误,恳请大家批评指正。谢谢啦。 首先学习参考下谷歌浏览器下载的界面: 界面比较的简洁明,很明确是用ExpandableListview外加adapter实现的,每个父项(group)展开来就是一个子项(child)列表,每个child包含一个progressbar和imageview和若干个textview。 二. ExpandableListview和ExpandableListAdapter熟悉 首先来看一下ExpandableListview应用的一个简单的例子,重点是ExpandableListAdapter适配器的使用。 例子1: 1. Test.java public class TestActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); //创建一个BaseExpandableListAdapter对象 ExpandableListAdapter adapter = new BaseExpandableListAdapter() { private String armTypes = new String { “第0行“, “第1行“, “第2行“}; private String arms = new String { { “第0项“, “第1项“}, { “第0项“, “第1项“, “第2项“}, { “第0项“, “第1项“ , “第2项“ , “第3项“} }; //获取指定组位置、指定子列表项处的子列表项数据 @Override public Object getChild(int groupPosition, int childPosition) { return arms[groupPosition][childPosition]; } @Override //子项id public long getChildId(int groupPosition, int childPosition) { return childPosition; } @Override //该组的子项数目 public int getChildrenCount(int groupPosition) { return arms[groupPosition].length; } //返回TextView对象 private TextView getTextView() { //设置每个TextView外观 //因为我使用的是480*320模拟器进行编码测试,所以在其他分辨率的模拟器上运行可能group项显示出来会出 //现重叠等问题,请修改下面函数中红色字体的参数值调整即可 AbsListView.LayoutParams lp = new AbsListView.LayoutParams( ViewGroup.LayoutParams.FILL_PARENT, 64); TextView textView = new TextView(TestActivity.this); textView.setLayoutParams(lp); textView.setGravity(Gravity.CENTER_VERTICAL | Gravity.LEFT); textView.setPadding(36, 0, 0, 0); textView.setTextSize(20); return textView; } //该方法决定每个子选项的外观 @Override public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) { System.out.println(“第“+groupPosition+“行“+“,“+“第“+childPosition+“项“); TextView textView = getTextView(); textView.setText(getChild(groupPosition, childPosition).toString()); return textView; } //获取指定组位置处的组数据 @Override public Object getGroup(int groupPosition) { return armTypes[groupPosition]; } @Override //获得组数目 public int getGroupCount() { return armTypes.length; } @Override public long getGroupId(int groupPosition) { return groupPosition; } //该方法决定每个组选项的外观 @Override public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) { System.out.println(“第“+groupPosition+“行“); LinearLayout ll = new LinearLayout(TestActivity.this); ll.setOrientation(0); TextView textView = getTextView(); textView.setText(getGroup(groupPosition).toString()); ll.addView(textView); return ll; } @Override public boolean isChildSelectable(int groupPosition, int childPosition) { return true; } @Override public boolean hasStableIds() { return true; } }; ExpandableListView expandListView = (ExpandableListView) findViewById(R.id.list); //设置adapter expandListView.setAdapter(adapter); } } 2.Main.xml 《?xml version=“1.0“ encoding=“utf-8“?》 《LinearLayout xmlns:android=“ android:orientation=“vertical“ android:layout_width=“fill_parent“ android:layout_height=“fill_parent“ 》 《ExpandableListView android:id=“@+id/list“ android:layout_height=“wrap_content“ android:layout_width=“fill_parent“ /》 《/LinearLayout》 代码运行之后是这个效果,废话我就不多说了。大致原理就是为了每个ExpandableListview配置了一个adapter适配器,规定了数据显示的格式内容。而我们是通过重写ExpandableListadapter的一些方法达到我们的目的的。函数很多,不一一说,不过有几个比较重要的函数如下: public Object getGroup(int groupPosition) //获得父项数据 public Object getChild(int groupPosition, int childPosition): //获得子项数据 public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) //获得父项的view public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) //获得子项的view 这些函数都是在expandablelistview显示时候适配器自动调用执行的。在这里我发现了一些的问题。在进行一些计算时候,有写数据被重复计算了或而且显示数据被覆盖,找其原因就是,就是每个函数被调用的次数不止一次。。为了弄清楚真相,我分别在getGroupView(),getChildView()这两个关键函数里写了几个控制台输出信息,方便我们观察其函数的调用关系和顺序。当程序运行第一次显示时候,如图2,观察结果如下: getGroupView()函数被总共调用了6次,在绘制每一行都被调用了2次,而且是安顺序的,与此同时,子项的构造函数getChildView()却没有被调用。可能大家都有疑问了,稍安勿躁,我们再进行下一步操作,展开第0行,如图3,这是控制台输出如下: 很明显,这次每个父项都被绘制了两次,子项也是,而且都是按顺序的,绘制完第0行,第0项,第1项。。。。绘完重头开始一遍。不信我们可以多试几次,是类似的情况,同一项都被绘制了两次。 由上我们可以总结出这样一个规律,当显示这样一个特殊的ExpandableListview时候,只要你进行一次界面的操作,展开或者关闭一个项,函数都要进行重绘,重新绘制显示出来的行和项,就像显示器的刷新一样。而且这样的操作要进行重复的2次。为什么是2次呢。。我也百思不得其解,上网查了许多资料都没有说明,最后在逛外国一论坛贴子时,看到一个老外给出了这样解答。。翻译过来大概是这样的,android并不保证每次的数据刷新成功,所以它就多刷了几次保证数据能够正常显示出来,正确与否有待考证,勉强算个理由吧。。 所以,大家注意了,以后就不要在adapter重载的函数里特别是getchildview()和getgroupview(),放一些异步的数据计算等相关操作,因为这些数据可能就会被系统第二次调用函数所覆盖掉。。。。 三。 ExpandableListview动态刷新显示数据 1.Handler机制 Android不允许Activity新启动的线程访问该Activity里的UI组件,这就出现了新线程无法改变UI界面的属性,但是我们要让新启动的线程周期性的改变界面组件的属性,就需要通过一些特殊的方法。android有几种方法可以实现,分别是AsyncTask,Handler等几种方式。其他几种方式不熟悉,这里我用的是Handler机制。 Handler运行在主线程中(UI线程中),它与子线程可以通过Message对象来传递数据。Handler可以分发Message对象和Runnable对象到主线程中, 每个Handler实例,都会绑定到创建他的线程中(一般是位于主线程)。这个时候,Handler就承担着接受子线程传过来的(子线程用sedMessage()方法传递Message对象(里面包含数据),把这些消息放入主线程队列中,配合主线程进行更新UI。 Handler中分发消息的一些方法,具体请看api和源码: post(Runnable) postAtTime(Runnable,long) postDelayed(Runnable long) sendEmptyMessage(int) sendMessage(Message) sendMessageAtTime(Message,long) sendMessageDelayed(Message,long) 2. notifyDataSetChanged() ExpandableListview在你不做任何界面操作时是不会自动调用函数刷新数据的。而有时候我们需要android界面自动更新某些界面元素,这就需要用到notifyDataSetChanged()。而notifyDataSetChanged()方法就是通过一个外部的方法控制如果适配器的内容改变时需要强制调用getView来刷新每个Item的内容的。
有谁知道织梦的CMS和织梦的EIMS的区别是什么
织梦CMS更侧重于各种类型的网站建设织梦EIMS更侧重于企业网站的建设。织梦CMS的可扩展性很强,也就是说可以通过安装多种插件和二次开发。达到很多种类型的网页内容展示效果。但是织梦EIMS的可扩展性没那么强。但是如果你是要建企业站的话,那么你用EIMS是非常方便的。因为,EIMS系统里面已经提供了很多现成的企业网站功能。你直接使用即可,不用作任何修改。