列表視圖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