用安卓写一个便签程序
为了练手,用安卓写一个便签程序,功能很简单,一个列表显示有多少便签,点击查看详细,长按能删除,列表界面点击添加按钮能新增。界面草图如下:
列表控件(ListView)
上网搜了一下,ListView的使用需要适配器,所以开始先搞定适配器。
适配器
根据列表的适配器类型,列表分为三种,ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。
ArrayAdapter的用法:
public class MyListView extends Activity {
private ListView listView;
//private List<String> data = new ArrayList<String>();
@Override
public void onCreate(Bundle savedInstanceState){
super.onCreate(savedInstanceState);
listView = new ListView(this);
listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
setContentView(listView);
}
private List<String> getData(){
List<String> data = new ArrayList<String>();
data.add("测试数据1");
data.add("测试数据2");
data.add("测试数据3");
data.add("测试数据4");
return data;
}
}
上面代码使用了ArrayAdapter(Context context, int textViewResourceId, List objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。
此时的界面是这样:
监听ListView点击事件
listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) {
// TODO Auto-generated method stub
int a;
}
});
OnItemClickListener是一个接口,此处是用匿名类实现了此接口。也可以在外部定义一个implements 了此接口的类,此处传入该类的一个实例。另外,?是个通配符,可以用任何由Object派生的类型代替,相当于 Class< ? extends Object>。
1. arg0 当前的AdapterView对象,这里就是listView
2. arg1 是AdapterView所绑定的Adapter的getView方法返回的View,即当前item的view,通过它可以获得该项中的各个组件。例如view.textview.settext(“abc”);
3. arg2是当前被点击的条目的索引号
4. arg3是AdapterView所绑定的Adapter的getItemId返回的值,是当前item的ID。这个id根据你在适配器中的写法可以自己定义。例如:list.get(id).equals(“abc”){//Do Something…}
写到这里我想实现一个简单的功能,点击某个item时更改其文字,结果百思不得姐,最后发现需要更改数据源后再通知ArrayAdapter重新加载,直接上代码:
ListView v = (ListView)arg0;
mydata.set(arg2, mydata.get(arg2) + “*”);
ArrayAdapter< String> n = (ArrayAdapter< String>)v.getAdapter();
选项菜单
在AS的res目录上右键》new》android resource directory,里面选择menu,菜单资源必须放在menu目录下。再通过右键菜单添加xml文件,我的如下:
<?xml version="1.0" encoding="utf-8"?>
<menu xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto">
<item android:id="@+id/action_add" android:title="@string/menu_add" app:showAsAction="ifRoom" />
</menu>
```-
item中的id="@+id/action_id"相当于mfc中的让ide自动分配资源id,会选择一个不存在的序号。
然后在activity中调用:
<div class="se-preview-section-delimiter"></div>
@Override
public boolean onCreateOptionsMenu(Menu menu){
MenuInflater inflater = getMenuInflater();
inflater.inflate(R.menu.mymenu, menu);
return super.onCreateOptionsMenu(menu);
}
添加消息响应:
<div class="se-preview-section-delimiter"></div>
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
Intent intent = new Intent(this, DetailActivity.class);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
“`
点击添加菜单项时调用添加activity
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
case R.id.action_add:
Intent intent = new Intent(this, DetailActivity.class);
startActivity(intent);
return true;
default:
return super.onOptionsItemSelected(item);
}
}
点击添加菜单项时调用添加activity
问题
contentProvider怎么定义?
Uri.parse中的content://怎么解释?