这样看果然是够慢的。不过也确实学到很多东西了。
之前讲了SimpleAdapter。这个虽然功能强大,但是有点死,就是也只能有那样的构造函数。(应该是哈)它能完成大部分的应用场景,但是对于少部分完不成的,可以使用扩展BaseAdapter的方法。
这个扩展BaseAdapter就有点麻烦了
public class MainActivity extends Activity
{
ListView myList;
@Override
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
myList = (ListView) findViewById(R.id.myList);
//程序到这里为止还是挺正常的。
//下面就是扩展这个Adapter。不像SimpleAdapter一个构造函数就明白了的那种
//BaseAdapter的函数里面有四个函数,实现了就完了,
//其中最重要的就是getCount()和getView()函数
//getView()好像是返回每一个列表项应该是个什么样子的
BaseAdapter adapter = new BaseAdapter()
{
@Override
public int getCount()
{
// 指定一共包含40个选项
return 40;
}
@Override
public Object getItem(int position)
{
return null;
}
// 重写该方法,该方法的返回值将作为列表项的ID
@Override
public long getItemId(int position)
{
return position;
}
// 重写该方法,该方法返回的View将作为列表框
//这里说是列表框,其实就是每个列表项要有的东西以及内容
//不过我十分怀疑能不能用xml文件去表示。
//不用怀疑,是能的,忘了之前的打气筒了么?
//将一个xml文件用打气筒打起来
@Override
public View getView(int position
, View convertView , ViewGroup parent)
{
// 创建一个LinearLayout,并向其中添加两个组件
//返回的是一个Layout的实例。这个就很有趣了是不是,居然是layout,
//这个layout里面还加了料。
//另外这种方式就是利用java写布局文件的吧。
//那种,打气筒的后半部分跟SimpleAdapter一样的,都是找到那个组件,
//并弄好什么样的组件显示什么内容那种。
LinearLayout line = new LinearLayout(MainActivity.this);
line.setOrientation(0);
ImageView image = new ImageView(MainActivity.this);
image.setImageResource(R.drawable.ic_launcher);
TextView text = new TextView(MainActivity.this);
text.setText("第" + (position +1 ) + "个列表项");
text.setTextSize(20);
text.setTextColor(Color.RED);
line.addView(image);
line.addView(text);
// 返回LinearLayout实例
return line;
}
};
myList.setAdapter(adapter);
}
}
掌握好两个函数就行了,扩展BaseAdapter也是很简单的!
自动完成的文本框,他是TextView的子类。
先看下面的代码:
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 创建一个ArrayAdapter,封装数组
ArrayAdapter aa = new ArrayAdapter(this,
android.R.layout.simple_dropdown_item_1line, books);
actv = (AutoCompleteTextView)findViewById(R.id.auto);
// 设置Adapter
actv.setAdapter(aa);
}
android.R.layout.simple_dropdown_item_1line
这句话但是有意思,连本来应该放在layout里面的东西也没了,直接用系统提供的东西就行了。
注意有很多系统提供的,不叫布局文件的布局文件,专门用在Adapter里面的
我看这个也没什么用就先不写了
spinner继承了Absadapter,AbsAdapter继承了AdapterView,那用spinner的时候只要按着AdapterView的性质为其准备好一个Adapter就行了。
按着惯例,spinner也能在xml文件里面指定entries的属性,而且spinner本身也就是下拉列表框,也不需要有样式什么的。
但是如果要动态的指定要下拉的内容的话,或许还是要配置Adapter的。
不过一般的spinner都是指定下拉框就行了,没必要指定adapter,一般也不动态变化的吧。
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
// 获取界面布局文件中的Spinner组件
spinner = (Spinner) findViewById(R.id.spinner);
String[] arr = { "孙悟空", "猪八戒", "唐僧" };
// 创建ArrayAdapter对象
//这种的就是能动态配置adapter的吧。
//上面的数组是动态传过来的,那可以这样,从网络上下载一个xml文件,解析之后弄成一个数组
//这样就能也算是动态弄了一个Adapter了吧。
ArrayAdapter adapter = new ArrayAdapter(this,
android.R.layout.simple_list_item_multiple_choice, arr);
// 为Spinner设置Adapter
spinner.setAdapter(adapter);
}
大的小的环形的那种进度条是不能显示进度的。
ps一句,我就服了,为啥main.xml文件有错误。activity文件也有错误,而且还是莫名其妙的错误。
public void onCreate(Bundle savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
bar = (ProgressBar) findViewById(R.id.bar);
bar2 = (ProgressBar) findViewById(R.id.bar2);
// 启动线程来执行任务
//下面这个是老生常谈了,新建一个线程,实现里面的run()方法,后边儿加个start()就行了
new Thread()
{
public void run()
{
while (status < 100)
{
// 获取耗时操作的完成百分比
status = doWork();
// 发送消息
mHandler.sendEmptyMessage(0x111);
}
}
}.start();
}
再看一次这样的模板
new Thread()
{
public void run()
{
}
}.start();
}
还有handler的模板:
Handler mHandler = new Handler()
{
@Override
public void handleMessage(Message msg)
{
}
};
这个组件一样的Handler啊。
android:progressDrawable=”@drawable/my_bar”
这个是指定progressbar的外观。
可以指定已完成的和未完成的外观:
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background"
android:drawable="@drawable/no" />
<item android:id="@android:id/progress"
android:drawable="@drawable/ok" />
layer-list>
根元素是:
layer-list
条目是:
< item android:id=”@android:id/background”
android:drawable=”@drawable/no” />
根元素是那个layer-list挺有意思的。”@android:id/background”这个东西是指定背景外观。”@android:id/progress”这个东西是指定完成的样式。
拖动条就是控制音量那种的,明白了吧?seekbar
你知道他多没节操不?滑块儿都可以自己定义!
public void onCreate(Bundle savedInstanceState)
{
SeekBar seekBar = (SeekBar) findViewById(R.id.seekbar);
seekBar.setOnSeekBarChangeListener(new OnSeekBarChangeListener()
{
// 当拖动条的滑块位置发生改变时触发该方法
@Override
public void onProgressChanged(SeekBar arg0, int progress,
boolean fromUser)
{
// 动态改变图片的透明度
//一个激灵,这能行吗?
//想想人家就是可以啊,这个跟按钮不是一样的么
//人家在UI县城里面,又不是在非UI线程里
image.setImageAlpha(progress);
}
});
}
xml文件:
android:max="255"
android:progress="255"
android:thumb="@drawable/ic_launcher"
thumb是滑块儿指定,没节操吧?
max和progress是最大的值和当前值。这个值在系统里面也应该是个确定的数值。
public void onProgressChanged(SeekBar arg0, int progress,
boolean fromUser)
上面的那个是系统传进来的progress。
他就是不滑了,改成星星了。
"@+id/rating"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:numStars="5"
android:max="255"
android:progress="255"
android:stepSize="0.5"/>
就是里面的星星也不能改,要他有啥用啊,就能做个评分项目了估计也。
指定最大255也没啥意思啊。
image.setImageAlpha((int) (rating * 255 / 5));
rating是float的,五个星星,大概float是几点几的意思吧,比如3.5颗星星,转化为一个星星占的比例。