在Android应用中常用到类似下面的界面

在这个界面中,每一行的布局都一样,只是填充的内容不同,针对这种方式的应用,我们可以使用ListView.

要使用ListView,首先我们要为该ListView的每个Item定义一个布局文件:

res/layout/item.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="horizontal" >

    <TextView
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:id="@+id/name_view"
        android:paddingTop="6dp"
        android:paddingBottom="6dp" />
    
    <TextView
        android:layout_width="110dp"
        android:layout_height="wrap_content"
        android:id="@+id/email_view"
        android:paddingTop="6dp"
        android:paddingBottom="6dp" />
    
    <TextView
        android:layout_width="100dp"
        android:layout_height="wrap_content"
        android:id="@+id/account_view"
        android:paddingTop="6dp"
        android:paddingBottom="6dp" />

</LinearLayout>

 

主界面: res/layout/activity_main.xml

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".MainActivity" >

    <LinearLayout 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="horizontal" >
    
        <TextView
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:paddingTop="6dp"
            android:paddingBottom="6dp"
            android:text="@string/name_label" />
        
        <TextView
            android:layout_width="110dp"
            android:layout_height="wrap_content"
            android:paddingTop="6dp"
            android:paddingBottom="6dp"
            android:text="@string/email_label" />
        
        <TextView
            android:layout_width="100dp"
            android:layout_height="wrap_content"
            android:paddingTop="6dp"
            android:paddingBottom="6dp"
            android:text="@string/account_label" />
    </LinearLayout>
    
    <ListView 
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:id="@+id/listView" />
    
</LinearLayout>

 

 

在使用ListView或网格布局时要用到适配器,达到在ListView的每个Item中填充数据的效果,下面举了三种适配器: SimpleAdapt, SimpleCursorAdapter和自定义适配器

package com.lk.sqlite;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import com.lk.adapter.CustomAdapter;
import com.lk.model.User;
import com.lk.service.UserService;
import com.lk.util.SQLHelper;

import android.os.Bundle;
import android.app.Activity;
import android.database.Cursor;
import android.view.Menu;
import android.view.View;
import android.widget.AdapterView;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.SimpleCursorAdapter;
import android.widget.Toast;

public class MainActivity extends Activity {
    private ListView listView;
    private UserService userService;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        userService = new UserService();
        SQLHelper sqlHelper = new SQLHelper(getApplicationContext(), 1);
        userService.setSqlHelper(sqlHelper );
        listView = (ListView) findViewById(R.id.listView);
        
//        showUserListWithSimpleAdapt();
        showUserListWithSimpleCursorAdapter();
//        showUserListWithCustomAdapter();
        
        //当点击ListView中每个条目时触发的事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view,
                    int position, long id) {
                ListView parentView = (ListView) parent;
                //第三种方式: 自定义Adapter
//                User user = (User) parentView.getItemAtPosition(position);
                
                //第二种方式: CursorAdapter
                Cursor cursor = (Cursor) parentView.getItemAtPosition(position);
                User user = new User();
                user.setId(cursor.getInt(cursor.getColumnIndex("_id")));
                user.setName(cursor.getString(cursor.getColumnIndex("name")));
                user.setEmail(cursor.getString(cursor.getColumnIndex("email")));
                user.setAccount(cursor.getDouble(cursor.getColumnIndex("account")));
                
                Toast.makeText(getApplicationContext(), user.getName() + ":" + user.getId(), Toast.LENGTH_SHORT).show();
            }
        });
    }

    private void showUserListWithCustomAdapter() {
        List<User> users = userService.findUserByPage(0, 15);
        CustomAdapter customAdapter = new CustomAdapter(getApplicationContext(), users, R.layout.item);
        listView.setAdapter(customAdapter);
        
    }

    private void showUserListWithSimpleCursorAdapter() {
        Cursor cursor = userService.findUserCursorByPagation(0, 15);
        //使用SimpleCursorAdapter适配器时,返回结果一定要包含"_id"字段。
        SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(getApplicationContext(), R.layout.item, cursor, 
                new String[]{"name", "email", "account"}, new int[]{R.id.name_view, R.id.email_view, R.id.account_view});
        listView.setAdapter(simpleCursorAdapter);
        
    }

    private void showUserListWithSimpleAdapt() {
        List<User> users = userService.findUserByPage(0, 15);
        List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
        for(User user: users) {
            Map<String, Object> map = new HashMap<String, Object>();
            map.put("id", user.getId());
            map.put("name", user.getName());
            map.put("email", user.getEmail());
            map.put("account", user.getAccount());
            data.add(map);
        }
        SimpleAdapter simpleAdapter = new SimpleAdapter(getApplicationContext(), data , R.layout.item,
                new String[]{"name", "email", "account"}, new int[]{R.id.name_view, R.id.email_view, R.id.account_view});
        listView.setAdapter(simpleAdapter);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
        return true;
    }

}

 

自定义适配器: 

package com.lk.adapter;

import java.util.List;

import com.lk.model.User;
import com.lk.sqlite.R;

import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.TextView;

public class CustomAdapter extends BaseAdapter {
    private List<User> users;
    //布局填充器
    private LayoutInflater layoutInflater;
    private int resource;
    
    public CustomAdapter() {
        super();
    }

    public CustomAdapter(Context context, List<User> users, int resource) {
        super();
        this.users = users;
        this.layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
        this.resource = resource;
    }

    @Override
    public int getCount() {
        return this.users.size();
    }

    @Override
    public Object getItem(int position) {
        return this.users.get(position);
    }

    @Override
    public long getItemId(int position) {
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        //这里每次都根据id获取View比较好性能,我们可以采用缓存
        TextView nameView = null;
        TextView emailView = null;
        TextView accountView = null;
        //convertView是一个view的缓存,当listView在第一面时缓存为空,否则缓存不为空
        if(convertView == null) {
            convertView = layoutInflater.inflate(resource, null);
            ViewCache.nameView = (TextView) convertView.findViewById(R.id.name_view);
            ViewCache.emailView = (TextView) convertView.findViewById(R.id.email_view);
            ViewCache.accountView = (TextView) convertView.findViewById(R.id.account_view);
        }
        nameView = ViewCache.nameView;
        emailView = ViewCache.emailView;
        accountView = ViewCache.accountView;
        
        User user = users.get(position);
        nameView.setText(user.getName());
        emailView.setText(user.getEmail());
        accountView.setText(String.valueOf(user.getAccount()));
        return convertView;
    }
    
    final static class ViewCache {
        public static TextView nameView = null;
        public static TextView emailView = null;
        public static TextView accountView = null;
    }

}

 

 

posted on 2014-03-17 22:14  寒岁青松  阅读(102)  评论(0)    收藏  举报