列表视图ListView是Android技术中重要的组件之一,我们能在绝大多数Android app中能见到这个技术的使用,那么用好它将会对我们的Android开发能力有很大的帮助。
总结一下ListView的一些常被使用的方式:listview组件是必须要有一个适配器加载子视图和数据的。其中最为常见的适配器有3种ArrayAdapter,SimpleAdapter以及SimpleCursorAdapter两种使用Android存储的方式(一种使用ContentProvider,一种使用数据库Sqlite)。
Simpleadapter组件的实现方式也比较简单,基本上和ArrayAdapter 方式一样,具体实例建议查看这个博客文章
http://blog.csdn.net/x605940745/article/details/11981049
1.简单的文本信息显示视图列表 使用适配器ArrayAdapter ,效果如下图:
源代码很简单的几行:
private ListView listView ;
private ArrayAdapter<String> arrayAdapter ;
private ArrayList al = new ArrayList<String>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
al.add("jack");
al.add("herry");
al.add("lisa");
al.add("sesilia");
listView = (ListView)findViewById(R.id.listView1);
arrayAdapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, al);
listView.setAdapter(arrayAdapter);
}
这个配置界面上的listview,你必须要先获得listview的对象。
还有一种是activity直接继承listactivity,就不需要获取listview对象,因此设置适配器的时候直接使用setAdapter函数。
2.和数据库绑定在一起的listview,使用的组件是SimpleCursorAdapter
使用listview组件显示Android通讯录中人员的姓名列表:运行效果如下
在通讯录中已经有了21个联系人,点击新增联系人按钮可以动态添加新的联系人 :运行效果如下
布局文件:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView1"
android:layout_weight="1"
android:layout_width="match_parent"
android:layout_height="0dp" >
</ListView>
<Button
android:id="@+id/button1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="新增联系人" />
</LinearLayout>
对应的java文件:MainActivity .java
package com.example.lvsimplecursoradapter;
import android.app.Activity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.provider.Contacts.People;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.Contacts.Data;
import android.provider.ContactsContract.RawContacts;
import android.view.View;
import android.widget.Button;
import android.widget.ListView;
import android.widget.SimpleCursorAdapter;
public class MainActivity extends Activity {
private int people = 0 ;
private SimpleCursorAdapter simpleCursorAdapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ListView listView = (ListView)findViewById(R.id.listView1);
Button b = (Button)findViewById(R.id.button1);
Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
startManagingCursor(cursor);
simpleCursorAdapter = new SimpleCursorAdapter(this, android.R.layout.simple_expandable_list_item_1, cursor, new String[]{People.NAME}, new int[]{android.R.id.text1});
listView.setAdapter(simpleCursorAdapter);
b.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
ContentValues values = new ContentValues();
//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
Uri rawContactUri = getContentResolver().insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
//往data表插入姓名数据
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);//内容类型
values.put(StructuredName.GIVEN_NAME, "联系人" + rawContactId);
getContentResolver().insert(ContactsContract.Data.CONTENT_URI, values);
refreshListView();
}
private void refreshListView() {
// TODO Auto-generated method stub
Cursor cursor = getContentResolver().query(People.CONTENT_URI, null, null, null, null);
simpleCursorAdapter.changeCursor(cursor);
}
});
}
}
注意在配置文件中配置用户读写通讯录的权限
3.通过simpleaCursordapter适配器使用自己定义的布局文件来使用listview
界面布局文件:activity_main.xml
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:orientation="vertical" >
<ListView
android:id="@android:id/list"
android:layout_width="match_parent"
android:layout_height="fill_parent"
android:layout_weight="1">
</ListView>
<LinearLayout
android:layout_width="fill_parent"
android:layout_height="fill_parent"
android:layout_marginBottom="0dp"
android:orientation="horizontal"
android:layout_weight="6">
<TextView
android:id="@+id/textView1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="name:" />
<EditText
android:id="@+id/editText1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:ems="10" >
</EditText>
<TextView
android:id="@+id/textView2"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:layout_weight="1"
android:text="gender:" />
<EditText
android:id="@+id/editText2"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:ems="10" >
</EditText>
<Button
android:id="@+id/button1"
android:layout_weight="1"
android:layout_width="fill_parent"
android:layout_height="match_parent"
android:text="添加" />
</LinearLayout>
</LinearLayout>
嵌套的布局文件:userinfo.xml
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<TextView
android:id="@+id/textView1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
<TextView
android:id="@+id/textView2"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="TextView" />
</LinearLayout>
还有其他功能上的嵌套布局文件,在此先不提...
对应的java文件:MainActivity .java
package com.example.sqliteex;
import java.util.zip.Inflater;
import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.ContentValues;
import android.content.DialogInterface;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.os.Bundle;
import android.support.v4.widget.SimpleCursorAdapter;
import android.view.LayoutInflater;
import android.view.View;
import android.widget.AdapterView;
import android.widget.Button;
import android.widget.EditText;
public class MainActivity extends ListActivity {
private SimpleCursorAdapter adapter;
private DBHelper db ;
private SQLiteDatabase read;
private SQLiteDatabase write;
private Button add ;
private EditText name ;
private EditText sex ;
private AdapterView.OnItemClickListener listViewClickListener = new AdapterView.OnItemClickListener(){
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3) {
// TODO Auto-generated method stub
//System.out.println(22222);
LayoutInflater layoutInflater = LayoutInflater.from(MainActivity.this);
View view = layoutInflater.inflate(R.layout.infoeditor, null);
final EditText name = (EditText)view.findViewById(R.id.name);
final EditText sex = (EditText)view.findViewById(R.id.sex);
Cursor c = adapter.getCursor();
c.moveToPosition(arg2);
name.setText(c.getString(c.getColumnIndex("name")));
sex.setText(c.getString(c.getColumnIndex("sex")));
final int itemId = c.getInt(c.getColumnIndex("_id"));
Dialog dialog = new AlertDialog.Builder(MainActivity.this).setView(view).setTitle("修改信息").setMessage("你确定要修改吗?").setNegativeButton("cancel", null).setPositiveButton("change", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
ContentValues values = new ContentValues();
values.put("name", name.getText().toString().trim());
values.put("sex", sex.getText().toString().trim());
write.update("userinfo", values, "_id = ?", new String[]{itemId + ""});
refreshListView();
}
}).create();
dialog.show();
}};
private AdapterView.OnItemLongClickListener listViewItemLongClickListener = new AdapterView.OnItemLongClickListener() {
@Override
public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
final int arg2, long arg3) {
// TODO Auto-generated method stub
//System.out.println(1111);//成功执行到这一步
new AlertDialog.Builder(MainActivity.this).setMessage("are you sure delete this item?").setTitle("warnning").setNegativeButton("cancel", null).setPositiveButton("sure", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface arg0, int arg1) {
// TODO Auto-generated method stub
//System.out.println(1111);
Cursor c = adapter.getCursor();
c.moveToPosition(arg2);
int itemId = c.getInt(c.getColumnIndex("_id"));
write.delete("userinfo", "_id = ?", new String[]{itemId + ""});
refreshListView();
}
}).show();
return true;
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
getListView().setOnItemLongClickListener(listViewItemLongClickListener);
getListView().setOnItemClickListener(listViewClickListener);
add = (Button)findViewById(R.id.button1);
name = (EditText)findViewById(R.id.editText1);
sex = (EditText)findViewById(R.id.editText2);
db = new DBHelper(this, null, null, 0);
read = db.getReadableDatabase();
write = db.getWritableDatabase();
Cursor cursor = read.query("userinfo", null, null, null, null, null, null, null);
adapter = new SimpleCursorAdapter(this, R.layout.userinfo, cursor, new String[]{"name","sex"} , new int[]{R.id.textView1,R.id.textView2});
setListAdapter(adapter);
// SQLiteDatabase write = db.getWritableDatabase();
// SQLiteDatabase read = db.getReadableDatabase();
// ContentValues values = new ContentValues();
// values.put("name", "henrry");
// values.put("sex", "男");
// write.insert("userinfo", null, values);
//
// values.put("name", "li");
// values.put("sex", "女");
// write.insert("userinfo", null, values);
add.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
String str1 = name.getText().toString();
String str2 = sex.getText().toString();
ContentValues value = new ContentValues();
value.put("name", str1);
value.put("sex", str2);
write.insert("userinfo", null, value);
refreshListView();
}
});
}
// new OnItemLongClickListener() {
//
// @Override
// public boolean onItemLongClick(AdapterView<?> arg0, View arg1,
// final int arg2, long arg3) {
// // TODO Auto-generated method stub
//
// new AlertDialog.Builder(MainActivity.this).setMessage("are you sure delete this item?").setTitle("warnning").setNegativeButton("cancel", null).setPositiveButton("sure", new DialogInterface.OnClickListener() {
//
// @Override
// public void onClick(DialogInterface arg0, int arg1) {
// // TODO Auto-generated method stub
//
// Cursor c = adapter.getCursor();
// c.moveToPosition(arg2);
// int itemId = c.getInt(c.getColumnIndex("_id"));
// write.delete("userinfo", "_id = ?", new String[]{itemId + ""});
//
// refreshListView();
// }
// });
//
//
// return true;
// }
// }
//
private void refreshListView()
{
Cursor c = read.query("userinfo", null, null, null, null, null, null);
adapter.changeCursor(c);
}
}
运行效果如下:初始化有自定义的数据库中有一条数据:jack ,male
添加一条心新数据 :herry ,formale