“Sarina”通过精心收集,向本站投稿了7篇android ScrollView嵌套Listview,以下是小编为大家整理后的android ScrollView嵌套Listview,希望对您有所帮助。

篇1:android ScrollView嵌套Listview
如果按照平常的设置,ScrollView里面的ListView是无法显示全部的,而且还不能滑动,从stackover flow搜的代码,亲测可以用!
1>给listView设置点击监视事件:
ListView lv = (ListView) findViewById(R.id.layout_lv);lv.setOnTouchListener(new OnTouchListener { // Setting on Touch Listener for handling the touch inside ScrollView @Override public boolean onTouch(View v, MotionEvent event) { // Disallow the touch request for parent scroll on touch of child view v.getParent().requestDisallowInterceptTouchEvent(true); return false; }});2>给listView设置高度自适应的方法:/**** Method for Setting the Height of the ListView dynamically. **** Hack to fix the issue of not showing all the items of the ListView **** when placed inside a ScrollView ****/ public static void setListViewHeightBasedOnChildren(ListView listView) { ListAdapter listAdapter = listView.getAdapter(); if (listAdapter == null) return; int desiredWidth = MeasureSpec.makeMeasureSpec(listView.getWidth(), MeasureSpec.UNSPECIFIED); int totalHeight = 0; View view = null; for (int i = 0; i < listAdapter.getCount(); i++) { view = listAdapter.getView(i, view, listView); if (i == 0) view.setLayoutParams(new ViewGroup.LayoutParams(desiredWidth, LayoutParams.WRAP_CONTENT)); view.measure(desiredWidth, MeasureSpec.UNSPECIFIED); totalHeight += view.getMeasuredHeight(); } ViewGroup.LayoutParams params = listView.getLayoutParams(); params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1)); listView.setLayoutParams(params); listView.requestLayout(); }ListView list = (ListView) view.findViewById(R.id.ls); setListViewHeightBasedOnChildren(list);ok,搞定~~~
篇2:listView实现时间轴
遇到一需求做一个时间轴左边是时间,右边是内容,中间就是那个轴的图片,
?1.中间轴线的图片需要根据内容的多少被拉长;
?2.顶部的圆点图片的位置不能左右边内容的顶部;
?3.底部不要轴线以圆点ImageView结束;
分析:
问题?1:设置图片parent的parent为wrap_content,设置android:minHeight=“100dp”,设置parent为match_parent;设置轴线ImageView为match_parent
问题?2:在轴线ImageView上面添加一个View(view_head),设置适当的高度,使轴线ImageView被顶下去;在Adapter中position<1的时候设置
view_head为透明色 holder.view_head.setBackgroundColor(context.getResources().getColor(android.R.color.transparent));
问题?3:adapter中判断是否是最后一条数据来隐藏轴线
上代码:
1.item_result_his
android:layout_width=“fill_parent”
android:layout_height=“fill_parent”
android:orientation=“horizontal”
android:id=“@+id/tvDate”
android:layout_width=“0dp”
android:layout_weight=“1”
android:layout_height=“wrap_content”
android:text=“TextView”
android:textColor=“@color/blue_deep”
android:textSize=“@dimen/font18”
android:gravity=“right”
android:padding=“@dimen/h8”/>
android:layout_width=“0dp”
android:layout_height=“wrap_content”
android:orientation=“horizontal”
android:layout_weight=“2”
android:minHeight=“100dp”>
android:layout_width=“wrap_content”
android:layout_height=“match_parent”
android:layout_marginLeft=“@dimen/h16”
android:layout_marginRight=“@dimen/h16”
android:gravity=“center_horizontal”
android:orientation=“vertical”
android:id=“@+id/view_head”
android:layout_width=“1dp”
android:layout_height=“12dp”
android:background=“@color/blue_deep” />
android:id=“@+id/imageView1”
android:layout_width=“wrap_content”
android:layout_height=“wrap_content”
android:src=“@drawable/checkreport_timebase_circle”
android:layout_centerHorizontal=“true”
/>
android:id=“@+id/iv_line”
android:layout_width=“wrap_content”
android:layout_height=“match_parent”
android:background=“@drawable/checkreport_timebase_line”
/>
android:id=“@+id/tvDoWhat”
android:layout_width=“match_parent”
android:layout_height=“wrap_content”
android:text=“ewTeTextViewTextViTextViewTextViTextViewTextViTextViewTextVixtViewTextViewTextViewTextViewTextViewTextViewTextViewTextViewTextView”
android:textColor=“@color/black”
android:textSize=“@dimen/font18”
android:padding=“@dimen/h8”/>
2.HistoryAdapter
package cn.szwx.app.business.adapter;
import java.util.ArrayList;
import android.content.Context;
import android.graphics.Color;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import cn.szwx.app.business.R;
import cn.szwx.app.business.entity.HistoryBean;
public class HistoryAdapter extends BaseAdapter{
private ArrayList
private Context context;
public HistoryAdapter(Context context,ArrayList
this.context=context;
this.list=list;
}
@Override
public int getCount() {
return list.size();
}
@Override
public HistoryBean getItem(int arg0) {
return list.get(arg0);
}
@Override
public long getItemId(int arg0) {
return arg0;
}
@Override
public View getView(int arg0, View convertView, ViewGroup parent) {
ViewHolder holder=null;
if(convertView==null){
convertView=View.inflate(context, R.layout.item_result_his, null);
holder=new ViewHolder();
holder.tvDate=(TextView) convertView.findViewById(R.id.tvDate);
holder.tvDoWhat=(TextView) convertView.findViewById(R.id.tvDoWhat);
holder.view_head=(View) convertView.findViewById(R.id.view_head);
holder.iv_line=(ImageView) convertView.findViewById(R.id.iv_line);
convertView.setTag(holder);
}else{
holder=(ViewHolder) convertView.getTag();
}
HistoryBean bean =list.get(arg0);
holder.tvDate.setText(bean.getDate());
holder.tvDoWhat.setText(bean.getRole()+bean.getWhatToDo());
//设置顶部View为透明色来控制顶部的显示
if(arg0<1){
//holder.view_head.setBackgroundColor(context.getResources().getColor(R.color.white));
holder.view_head.setBackgroundColor(context.getResources().getColor(android.R.color.transparent));
}else{
}
//控制底部的显示
if(list.size()>0){
if(arg0==list.size()-1){
holder.iv_line.setVisibility(View.GONE);
}else{
holder.iv_line.setVisibility(View.VISIBLE);
}
}
return convertView;
}
class ViewHolder{
TextView tvDate;
TextView tvDoWhat;
View view_head;
ImageView iv_line;
}
public void notifyDataSetChanged(ArrayList
this.list=data;
notifyDataSetChanged();
}
}
3.调用:
HistoryBean bean2=new HistoryBean();
bean2.setDate(“.1.1”);
bean2.setWhatToDo(“做了什么做了什么做了什么做了什么做了什么做了什么做了什么做了什么”
+ “做了什么做了什么做了什么做了什么做了什么做了什么做了什么做了什么”
+ “做了什么做了什么做了什么做了什么做了什么做了什么做了什么做了什么做了什么做了什么”);
bean2.setRole(“什么角色”);
list.add(bean2);
//设置Adapter
for (int i = 0; i <40; i++) {
HistoryBean bean=new HistoryBean();
bean.setDate(“2015.1.1”+i);
bean.setWhatToDo(“做了什么”+i);
bean.setRole(“什么角色”);
list.add(bean);
}
adapter=new HistoryAdapter(context, list);
rootView.setAdapter(adapter);

篇3:Android之ListView设置
Android开发中,我们常使用到ListView视图,下面介绍ListView的几种使用方法,
主界面首先,在主界面上添加几个按钮,用于界面跳转。
界面布局:
源码:
package com.example.listviewdemo;import android.os.Bundle;import android.view.View;import android.app.Activity;import android.content.Intent;public class MainActivity extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void Button1(View v) { Intent intent = new Intent; intent.setClass(MainActivity.this, Activity01.class); startActivity(intent); } public void Button2(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, Activity02.class); startActivity(intent); } public void Button3(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, Activity03.class); startActivity(intent); } public void Button4(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, SimpleList.class); startActivity(intent); } public void Button5(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, TitleList.class); startActivity(intent); } public void Button6(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, IconList.class); startActivity(intent); } public void Button7(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, ColorList.class); startActivity(intent); } public void Button8(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, ArrayList.class); startActivity(intent); } public void Button9(View v) { Intent intent = new Intent(); intent.setClass(MainActivity.this, MyTest.class); startActivity(intent); }}
效果:
使用ListView设置界面package com.example.listviewdemo;import java.util.ArrayList;import java.util.List;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class Activity01 extends Activity{ private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = new ListView(this); listView.setAdapter(new ArrayAdapter
效果
使用SimpleAdapter设置界面package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.ListActivity;import android.os.Bundle;import android.widget.SimpleAdapter;public class Activity02 extends ListActivity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); SimpleAdapter adapter = new SimpleAdapter(this,getData(),R.layout.vlist, new String[]{“title”,“info”,“img”}, new int[]{R.id.title,R.id.info,R.id.img}); setListAdapter(adapter); } private List
效果
使用MyAdapter设置界面package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.List;import java.util.Map;import android.app.AlertDialog;import android.app.ListActivity;import android.content.Context;import android.content.DialogInterface;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.BaseAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class Activity03 extends ListActivity{ private List vlist2布局 效果 package com.example.listviewdemo;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class SimpleList extends ListActivity{ private String[] mListStr = {“标题1:内容1”,“标题2:内容2”,“标题3:内容3”,“标题4:内容4”}; ListView mListView = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = getListView(); setListAdapter(new ArrayAdapter 效果 package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class TitleList extends ListActivity{ private String[] mListTitle = { “标题1”, “标题2”, “标题3”, “标题4”, “标题5”}; private String[] mListStr = { “内容1”, “内容2”, “内容3”, “内容4”, “内容5” }; ListView mListView = null; ArrayList 效果 package com.example.listviewdemo;import java.util.ArrayList;import java.util.HashMap;import java.util.Map;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.ListView;import android.widget.SimpleAdapter;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class IconList extends ListActivity{ private String[] mListTitle = { “标题1”, “标题2”, “标题3”, “标题4”, “标题5”}; private String[] mListStr = { “内容1”, “内容2”, “内容3”, “内容4”, “内容5” }; ListView mListView = null; ArrayList iconlist布局 效果 package com.example.listviewdemo;import android.app.ListActivity;import android.content.Context;import android.graphics.Color;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;import android.widget.AdapterView.OnItemClickListener;public class ColorList extends ListActivity{ private String[] mListTitle = { “标题1”, “标题2”, “标题3”, “标题4”, “标题5”}; private String[] mListStr = { “内容1”, “内容2”, “内容3”, “内容4”, “内容5” }; ListView mListView = null; MyListAdapter myAdapter = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); mListView = getListView(); myAdapter = new MyListAdapter(this); setListAdapter(myAdapter); mListView.setOnItemClickListener(new OnItemClickListener() {@Overridepublic void onItemClick(AdapterViewadapterView, View view, int position,long id) { View v=adapterView.getChildAt(position); v.setBackgroundColor(Color.RED); Toast.makeText(ColorList.this,“您选择了” + mListStr[position], Toast.LENGTH_LONG).show();} }); } class MyListAdapter extends BaseAdapter { private int[] colors = new int[] { 0xff626569, 0xff4f5257 }; public MyListAdapter(Context context) {mContext = context; } public int getCount() {return mListStr.length; } @Override public boolean areAllItemsEnabled() {return false; } public Object getItem(int position) {return position; } public long getItemId(int position) {return position; } public View getView(int position, View convertView, ViewGroup parent) {ImageView iamge = null;TextView title = null;TextView text = null;if (convertView == null) { convertView = LayoutInflater.from(mContext).inflate(R.layout.colorlist, null); iamge = (ImageView) convertView.findViewById(R.id.color_image); title =(TextView) convertView.findViewById(R.id.color_title); text= (TextView) convertView.findViewById(R.id.color_text);} int colorPos = position % colors.length;convertView.setBackgroundColor(colors[colorPos]);title.setText(mListTitle[position]);text.setText(mListStr[position]);iamge.setImageResource(R.drawable.icon_gcoding);return convertView; } private Context mContext; }} colorlist布局 效果 package com.example.listviewdemo;import android.app.ListActivity;import android.content.Context;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.view.View.OnClickListener;import android.widget.ArrayAdapter;import android.widget.Button;import android.widget.ImageView;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;public class ArrayList extends ListActivity{ private String[] mListTitle = { “标题1”, “标题2”, “标题3”, “标题4”, “标题5”}; private String[] mListStr = { “内容1”, “内容2”, “内容3”, “内容4”, “内容5” }; ListView mListView = null; MyListAdapter myAdapter = null; ArrayList arrayList = null; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); arrayList = this; mListView = getListView(); myAdapter = new MyListAdapter(this,R.layout.arraylist); setListAdapter(myAdapter); } public class MyListAdapter extends ArrayAdapter arraylist布局 效果 第一个界面 package com.example.listviewdemo;import android.app.Activity;import android.content.Intent;import android.os.Bundle;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.AdapterView.OnItemClickListener;public class MyTest extends Activity{ private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); listView = new ListView(this); listView.setAdapter(new DemoListAdapter()); setContentView(listView); listView.setOnItemClickListener(new OnItemClickListener() { @Overridepublic void onItemClick(AdapterViewadapterView, View view, int position,long id) { onListItemClick(position); } }); } void onListItemClick(int index) { Intent intent = null; intent = new Intent(this,demos[index].demoClass); startActivity(intent); } private static final DemoInfo[] demos = { new DemoInfo(R.string.title1, R.string.content1, MyTest2.class), new DemoInfo(R.string.title2, R.string.content2, MyTest2.class), new DemoInfo(R.string.title3, R.string.content3, MyTest2.class), }; private class DemoListAdapter extends BaseAdapter { public DemoListAdapter() { super(); } @Override public View getView(int position, View convertView, ViewGroup parent) { convertView = View.inflate(MyTest.this, R.layout.list, null); TextView title = (TextView)convertView.findViewById(R.id.title); TextView desc = (TextView)convertView.findViewById(R.id.info); title.setText(demos[position].title); desc.setText(demos[position].desc); return convertView; } @Override public int getCount() { return demos.length; } @Override public Object getItem(int position) { return demos[position]; } @Override public long getItemId(int position) { return position; } } private static class DemoInfo { private final int title; private final int desc; private final ClassdemoClass; public DemoInfo(int title, int desc, ClassdemoClass) { this.title = title; this.desc = desc; this.demoClass = demoClass; } }} 第二个界面 package com.example.listviewdemo;import android.app.Activity;import android.os.Bundle;import android.view.View;public class MyTest2 extends Activity{ @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); View view = new View(this); setContentView(view); }} list布局 效果 前段时间 遇到 listview 和scrollview 布局的问题 ,现在提供一个解决方案 if (listAdapter == null || listAdapter.getCount() == 0) { return;}int totalHeight = 0;for (int i = 0; i < listAdapter.getCount(); i++) { View listItem = listAdapter.getView(i, null, listView); listItem.measure(0, 0); totalHeight += listItem.getMeasuredHeight();}ViewGroup.LayoutParams params = listView.getLayoutParams();params.height = totalHeight + (listView.getDividerHeight() * (listAdapter.getCount() - 1));listView.setLayoutParams(params);listView.clearFocus(); 这个里面有一个很重要的问题,在调用 listItem.measure(0, 0); 有些时候会报错,根本原因在于 listitem 的布局;最外面布局采用 LinearLayout,在调用listItem.measure(0, 0)时,其实根本是调用 LinearLayout.measure 方法;同样 RelativeLayout 布局也是一样,但是,调用RelativeLayout .measure 方法 会报错 , android listview,GridView 和 ScrollView , 解决办法: 1.listitem 布局最外层 用LinearLayout。 2. listitem 布局最外层 依然采用 RelativeLayout 布局,自定义RelativeLayout 并重写 onMeasure方法 @Overrideprotected void onMeasure (int widthMeasureSpec, int heightMeasureSpec){ int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); // Restrict the aspect ratio to 1:1, fitting within original specified dimensions int chosenDimension = Math.min(widthSize, heightSize); widthMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); heightMeasureSpec = MeasureSpec.makeMeasureSpec(chosenDimension, MeasureSpec.AT_MOST); getLayoutParams().height = chosenDimension; getLayoutParams().width = chosenDimension; super.onMeasure(widthMeasureSpec, heightMeasureSpec); } 《C陷阱与缺陷》中有一个有意思的问题:“某些C编译器允许嵌套注释,请写一个测试程序,要求:无论是对允许嵌套注释的编译器,还是对不允许嵌套注释的编译器,该程序都能正常通过编译(无错误消息出现),但是这两种情况下程序执行的结果却不相同。 (提示:在用引号括起来的字符串中,注释符I*属于字符串的一部分,而在注释中出现的双引号””又属于注释的一部分。)” 我觉得这对C的词法分析挺有意思的。要是聪明的您,有什么办法呢? 以下是作者给出的答案,确实很精妙,尤其第二个。 ——为了判断编译器是否允许嵌套注释,必须找到这样一组符号序列,无论是对于允许嵌套注释的编译器,还是不允许嵌套注释的编译器,它都是合法的;但是,对于两类不同的编译器,它却意味着不同的事物。这样一组符号序列不可避免地要涉及嵌套注释,让我们从这里开始讨论: /*/**/ 对于一个允许嵌套注释的C编译器,无论上面的符号序列后面跟什么,都属于注释的一部分;而对于不允许嵌套注释的C编译器,后面跟的就是实实在在的代码内容。也许有人因此想到可以在后面再跟一个用一对引号引起的注释结束符: /*/**/ “*/” 如果允许嵌套注释,上面的符号序列就等效于一个引号;如果不允许,那么就等效于一个字符串“*I”。因此,我们可以接着在后面跟一个注释开始符以及一个引号: /*/**/ “*/”/*“ 如果允许嵌套注释,上面就等效于用一对引号引起的注释开始符”/*“;如果不允许,那么就等效于一个用引号括起的注释结束符,后跟一段未结束的注释, 我们可以简单地让最后的注释结束: /*/**/ ”*/“/*” /**/ 这样,如果允许嵌套注释,上面的表达式就等效于“/*”,:如果不允许,那么就等效于,“*/”。 在我用基本上类似于上面的形式解决这个问题之后,Doug McIlroy发现了下面这个让人拍案叫绝的解法: /*/*/0*/**/1 这个解法主要利用了编译器作词法分析时的“大嘴法”规则。如果编译器允许嵌套注释,则上式将被解释为: /*/*/0*/**/1 两个/*符号与两个*/符号正好匹配,所以上式的值就是1。如果不允许嵌套注释,注释中的/*将被忽略。因此,即使卿出现在注释中也没有特殊的含义:上面的表达式因此将被这样解释: /*/*/0*/**/1 它的值就是0*1,也就是0o 上面利用一个特殊构造的字符串就完成了这个任务,果然精妙! 而当时我对这个特殊字符串推导时没有看到希望,用了宏来帮忙,设计了下面的程序: #define A /* aaa /* a*/ a #define B */ bool CanNesting { #ifdef B return false; #else return true; #endif } 上面程序中,如果支持嵌套,B的宏定义属于注释的一部分,所以B应该没有被定义,函数返回true。否则,就不支持嵌套,函数返回false。 嵌套SELECT语句也叫子查询,形如: SELECT name FROM bbc WHERE region = (SELECT region FROM bbc WHERE name = 'Brazil') 一个 SELECT 语句的查询结果可以作为另一个语句的输入值, 上面的 SQL 语句作用为获得和'Brazil'(巴西)同属一个地区的所有国家。 嵌套SELECT语句也叫子查询,形如: SELECT name FROM bbc WHERE region = (SELECT region FROM bbc WHERE name = 'Brazil') 一个 SELECT 语句的查询结果可以作为另一个语句的输入值。 上面的SQL语句作用为获得和'Brazil'(巴西)同属一个地区的所有国家。 子查询不但可以出现在Where子句中,也可以出现在from子句中,作为一个临时表使用, 也可以出现在select list中,作为一个字段值来返回。本节我们仅介绍的Where子句中的子查询。 在Where子句中使用子查询,有一个在实际使用中容易犯的错在这里说明一下。 通常,就像上面的例子一样,嵌套的语句总是和一个值进行比较。 语句 (SELECT region FROM bbc WHERE name = 'Brazil') 应该仅返回一个地区,即 'Americas'. 但如果我们在表中再插入一条地区为欧洲,国家名称为Brazil的记录,那会发生什么情况? 这将会导致语句的运行时错误.因为这个SQL语句的语法是正确的,所以数据库引擎就开始执行, 但当执行到外部的语句时就出错了。 因为这时的外部语句就像好像是 SELECT name FROM bbc WHERE region = ('Americas', 'Europe'), 这个语句当然报错了, 那么有没有办法解决这个问题呢,当然有。有一些SQL查询条件允许对列表值(即多个值)进行操作。 例如“IN” 操作符,可以测试某个值是否在一个列表中。 下面的语句就可以安全的执行而不出错,不管表中有多少条包含Brazils的记录 SELECT name FROM bbc WHERE region IN (SELECT region FROM bbc WHERE name = 'Brazil') OK, 让我们再看看一些具体的实例, 一、给出人口多于Russia(俄国)的国家名称 SELECT name FROM bbc WHERE population> (SELECT population FROM bbc WHERE name='Russia') 二、给出'India'(印度), 'Iran'(伊朗)所在地区的所有国家的所有信息 SELECT * FROM bbc WHERE region IN (SELECT region FROM bbc WHERE name IN ('India','Iran')) 三、给出人均GDP超过'United Kingdom'(英国)的欧洲国家. SELECT name FROM bbc WHERE region='Europe' AND gdp/population > (SELECT gdp/population FROM bbc WHERE name='United Kingdom') 原文转自:www.ltesting.net 关于中断嵌套: 在linux内核里,如果驱动在申请注册中断的时候没有特别的指定,do_irq在做中断响应的时候,是开启中断的,如果在驱动的中断处理函数正在执行的过程中,出现同一设备的中断或者不同设备的中断,这时候新的中断会被立即处理,还是被pending,等当前中断处理完成后,再做处理, 在2.4和2.6内核里,关于这一块是否有什么不同。 一般申请中断的时候都允许开中断,即不使用SA_INTERRUPT标志。如果允许共享则加上 SA_SHIRQ,如果可以为内核熵池提供熵值(譬如你写的驱动是ide之类的驱动),则再加上 SA_SAMPLE_RANDOM标志。这是普通的中断请求过程。对于这种一般情况,只要发生中断,就可以抢占内核,即使内核正在执行其他中断函数。这里有两点说明:一是因为linux不支持 中断优先级,因此任何中断都可以抢占其他中断,但是同种类型的中断(即定义使用同一个 中断线的中断)不会发生抢占,他们会在执行本类型中断的时候依次被调用执行。二是所谓 “只要发生中断,就可以抢占内核”这句是有一定限制的,因为当中断发生的时候系统由中断门 进入时自动关中断(对于x86平台就是将eflags寄存器的if位置为0),只有当中断函数被执行 (handle_IRQ_event)的过程中开中断之后才能有抢占。 对于同种类型的中断,由于其使用同样的idt表项,通过其状态标志(IRQ_PENDING和 IRQ_INPROGRESS)可以防止同种类型的中断函数执行(注意:是防止handle_IRQ_event被重入, 而不是防止do_IRQ函数被重入),对于不同的中断,则可以自由的嵌套。因此,所谓中断嵌套, 对于不同的中断是可以自由嵌套的,而对于同种类型的中断,是不可以嵌套执行的。 以下简单解释一下如何利用状态标志来防止同种类型中断的重入: 当某种类型的中断第一次发生时,首先其idt表项的状态位上被赋予IRQ_PENDING标志,表示有待处理。 然后将中断处理函数action置为null,然后由于其状态没有IRQ_INPROGRESS标志(第一次),故将其状态置上IRQ_INPROGRESS并去处IRQ_PENDING标志,同时将action赋予相应的中断处理函数指针(这里是一个重点,linux很巧妙的用法,随后说明)。这样,后面就可以顺利执行handle_IRQ_event进行中断处理,当在handle_IRQ_event中开中断后,如果有同种类型的中断发生,则再次进入do_IRQ函数,然后其状态位上加上IRQ_PENDING标志,但是由于前一次中断处理中加上的IRQ_INPROGRESS没有被清除,因此这里无法清除IRQ_PENDING标志,因此action还是为null,这样就无法再次执行handle_IRQ_event函数。从而退出本次中断处理,返回上一次的中断处理函数中,即继续执行handle_IRQ_event函数。当handle_IRQ_event返回时检查IRQ_PENDING标志,发现存在这个标志,说明handle_IRQ_event执行过程中被中断过,存在未处理的同类中断,因此再次循环执行handle_IRQ_event函数。直到不存在IRQ_PENDING标志为止。 2.4和2.6的差别,就我来看,主要是在2.6中一进入do_IRQ,多了一个关闭内核抢占的动作,同时在处理中多了一种对IRQ_PER_CPU类型的中断的处理,其他没有什么太大的改变。这类IRQ_PER_CPU的中断主要用在smp环境下将中断绑定在某一个指定的cpu上。例如arch/ppc/syslib/open_pic.c中的openpic_init中初始化ipi中断的时候。 其实简单的说,中断可以嵌套,但是同种类型的中断是不可以嵌套的,因为在IRQ上发生中断,在中断响应的过程中,这个IRQ是屏蔽的,也就是这个IRQ的中断是不能被发现的。 同时在内核的临界区内,中断是被禁止的 关于do_IRQ可能会丢失中断请求: do_IRQ函数是通过在执行完handle_IRQ_event函数之后判断status是否被设置了IRQ_PENDING标志来判断是否还有没有被处理的同一通道的中断请求, 但是这种方法只能判断是否有,而不能知道有多少个未处理的统一通道中断请求。也就是说,假如在第一个中断请求执行handle_IRQ_event函数的过程中来了同一通道的两个或更多中断请求,而这些中断不会再来,那么仅仅通过判断status是否设置了IRQ_PENDING标志不知道到底有多少个未处理的中断,handle_IRQ_event只会被再执行一次。 这算不算是个bug呢? 不算,只要知道有中断没有处理就OK了,知道1个和知道N个,本质上都是一样的。作为外设,应当能够处理自己中断未被处理的情况。 不可能丢失的,在每一个中断描述符的结构体内,都有一个链表,链表中存放着服务例程序 关于中断中使用的几个重要概念和关系: 一、基本概念 1. 2.由中断或异常执行的代码不是一个进程,而是一个内核控制路径,代表中断发生时正在运行的进程的执行 中断处理程序与正在运行的程序无关 引起异常处理程序的进程正是异常处理程序运行时的当前进程 二、特点 1.(1)尽可能快 (2)能以嵌套的方式执行,但是同种类型的中断不可以嵌套 (3)尽可能地限制临界区,因为在临界区中,中断被禁止 2.大部分异常发生在用户态,缺页异常是唯一发生于内核态能触发的异常 缺页异常意味着进程切换,因此中断处理程序从不执行可以导致缺页的操作 3.中断处理程序运行于内核态 中断发生于用户态时,要把进程的用户空间堆栈切换到进程的系统空间堆栈,刚切换时,内核堆栈是空的 中断发生于内核态时, 不需要堆栈空间的切换 三、分类 1.中断的分类:可屏蔽中断、不可屏蔽中断 2.异常的分类: 四、IRQ 1.硬件设备控制器通过IRQ线向CPU发出中断,可以通过禁用某条IRQ线来屏蔽中断。 2.被禁止的中断不会丢失,激活IRQ后,中断还会被发到CPU 3.激活/禁止IRQ线 != 可屏蔽中断的 全局屏蔽/非屏蔽 可以有选择地禁止每条IRQ线。因此,可以对PIC编程从而禁止IRQ,也就是说,可以告诉PIC停止对给定的IRQ线发布中断,或者激活它们。禁止的中断时丢失不了的,它们一旦被激活,PIC就又把它们发送到CPU。这个特点被大多数中断处理程序使用,因为这允许中断处理程序逐次地处理同一类型的IRQ 假定CPU有一条激活的IRQ线。一个硬件设备出现在这条IRQ线程上,且多APIC系统选择我们的CPU处理中断。在CPU应答中断前,这条IRQ线被另一个CPU屏蔽掉;结果,IRQ_DISABLED标志被设置。随后,我们的CPU开始处理挂起的中断;因此,do_IRQ()函数应答这个中断,然后返回,但没有执行中断服务例程,因为它发现IRQ_DISABLED标志被设置了,因此,在IRQ线禁用之前出现的中断丢失了。 为了应付这种局面,内核用来激活IRQ线的enable_irq()函数先检查是否发生了中断丢失,如果是,该函数就强迫硬件让丢失的中断再产生一次 它们最大的不同是上半部分不可中断,而下半部分可中断篇4:android listview,GridView 和 ScrollView
篇5:C语言嵌套注释
篇6:第五节 嵌套SELECT语句数据库
篇7:linux中断中断嵌套&中断请求丢失






