您的位置:首页 > 移动开发 > Android开发

Android重要组件ListView的技术使用,研究。(持续更新...)

2016-04-28 17:42 691 查看
列表视图ListView是Android技术中重要的组件之一,我们能在绝大多数Android app中能见到这个技术的使用,那么用好它将会对我们的Android开发能力有很大的帮助。



总结一下ListView的一些常被使用的方式:listview组件是必须要有一个适配器加载子视图和数据的。其中最为常见的适配器有3种ArrayAdapter,SimpleAdapter和SimpleCursorAdapter。

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

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: