android 个人学习笔记------------GridView&ListView

来源:互联网 发布:华为系统优化 编辑:程序博客网 时间:2024/05/16 07:20

MainActivity

package com.sjm.gridviewAndListview;import com.sjm.expandableListview.ExpandableListviewActivity;import com.sjm.gridview.R;import android.app.Activity;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.view.LayoutInflater;import android.view.View;import android.view.ViewGroup;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.BaseAdapter;import android.widget.GridView;import android.widget.ImageView;import android.widget.TextView;import android.widget.Toast;/** * gridView组件+listView组件 *  * listview优化: *  * 1、使用固定的宽高,便面内容的变化导致重复渲染 *  * 2、使用convertView减少内存的消耗 *  * 3、使用viewHolder减少对象的查找 *  * @author sjm * */public class MainActivity extends Activity {    private GridView gridView;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        gridView = (GridView) findViewById(R.id.gridView);        gridView.setAdapter(new MyAdapter(this));        gridView.setOnItemClickListener(new OnItemClickListener() {            /**             * parent:girdView             *              * view:item布局             *              * position:位置----->坐标从0开始             *              * id:编号             */            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                TextView tv_item = (TextView) view.findViewById(R.id.tv_item);                String itemValue = tv_item.getText().toString();                if (itemValue.equals("红包")) {                    Intent intent = new Intent(MainActivity.this, ListViewActivity1.class);                    startActivity(intent);                } else if (itemValue.equals("查询")) {                    Intent intent = new Intent(MainActivity.this, ListViewActivity2.class);                    startActivity(intent);                } else if (itemValue.equals("基金")) {                    Intent intent = new Intent(MainActivity.this, ListViewActivity3.class);                    startActivity(intent);                } else if (itemValue.equals("商城")) {                    Intent intent = new Intent(MainActivity.this, ListViewNotifyDataSetChanged.class);                    startActivity(intent);                }else if (itemValue.equals("国债")) {                    Intent intent = new Intent(MainActivity.this, ExpandableListviewActivity.class);                    startActivity(intent);                } else {                    Toast.makeText(getApplicationContext(), "选择了第" + (id + 1) + "张图片-----" + "值为:" + itemValue,                            Toast.LENGTH_LONG).show();                }            }        });    }    /**     * 自定义适配器------>继承BaseAdapter     *      * @author sjm     *     */    static class MyAdapter extends BaseAdapter {        private Context context;        private MyAdapter(Context context) {            this.context = context;        }        private int[] images = { R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3,                R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7, R.drawable.sample_0,                R.drawable.sample_1, R.drawable.sample_2, R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5,                R.drawable.sample_6, R.drawable.sample_7, R.drawable.sample_0, R.drawable.sample_1, R.drawable.sample_2,                R.drawable.sample_3, R.drawable.sample_4, R.drawable.sample_5, R.drawable.sample_6, R.drawable.sample_7,                // R.drawable.sample_thumb_0, R.drawable.sample_thumb_1,                // R.drawable.sample_thumb_2,                // R.drawable.sample_thumb_3, R.drawable.sample_thumb_4,                // R.drawable.sample_thumb_5,                // R.drawable.sample_thumb_6, R.drawable.sample_thumb_7        };        private String[] appNames = { "转账", "查询", "金融", "基金", "国债", "贷款", "信用卡", "商城", "充值", "提款", "红包", "贷款", "转账",                "查询", "金融", "基金", "国债", "红包", "转账", "查询", "金融", "基金", "国债", "贷款" };        @Override        public int getCount() {            // TODO 数据的长度            return images.length;// or appNames.length        }        @Override        public Object getItem(int position) {            // TODO 获取每一个选项            return appNames[position];        }        @Override        public long getItemId(int position) {            // TODO 每一个选项的id,直接使用position            return position;        }        /**         * convertView:减少对面的创建         *          * ViewHolder:查询id,避免已经存在的时候重复查找         */        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder holder;            // TODO 填充数据            if (convertView == null) {                convertView = LayoutInflater.from(context).inflate(R.layout.item_gridview, null);                holder = new ViewHolder();                holder.iv_item = (ImageView) convertView.findViewById(R.id.iv_item);                holder.tv_item = (TextView) convertView.findViewById(R.id.tv_item);                convertView.setTag(holder);            } else {                holder = (ViewHolder) convertView.getTag();            }            // ImageView iv_item = (ImageView)            // convertView.findViewById(R.id.iv_item);            // TextView tv_item = (TextView)            // convertView.findViewById(R.id.tv_item);            holder.iv_item.setImageResource(images[position]);            holder.tv_item.setText(appNames[position]);            return convertView;        }        /**         * 用于第一次查找组件,避免下一次重复查找         *          * @author sjm         *         */        static class ViewHolder {            ImageView iv_item;            TextView tv_item;        }    }}```**ListViewActivity1**<div class="se-preview-section-delimiter"></div>

这里写代码片
“`

package com.sjm.gridviewAndListview;import com.sjm.gridview.R;import android.app.Activity;import android.os.Bundle;import android.view.View;import android.widget.AdapterView;import android.widget.AdapterView.OnItemClickListener;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;/** * listview 基本用法 *  * @author sjm * */public class ListViewActivity1 extends Activity {    private ListView lv_listview;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.listview1_layout);        lv_listview = (ListView) findViewById(R.id.lv_listview);        lv_listview.setOnItemClickListener(new OnItemClickListener() {            @Override            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {                TextView textValue = (TextView) view;                Toast.makeText(ListViewActivity1.this, "当前点击结果为:" + textValue.getText().toString(),                        Toast.LENGTH_LONG).show();            }        });    }}```**ListViewActivity2**<div class="se-preview-section-delimiter"></div>

这里写代码片
“`

package com.sjm.gridviewAndListview;import com.sjm.gridview.R;import android.app.ListActivity;import android.os.Bundle;import android.view.View;import android.widget.ArrayAdapter;import android.widget.ListView;import android.widget.TextView;import android.widget.Toast;/** * ListActivity的基本用法,不需要自己写xml布局文件 *  * @author sjm * */public class ListViewActivity2 extends ListActivity {    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        ArrayAdapter<?> adapter = ArrayAdapter.createFromResource(getApplicationContext(), R.array.name,                android.R.layout.simple_list_item_activated_1);        setListAdapter(adapter);    }    /**     * item点击事件     */    @Override    protected void onListItemClick(ListView l, View v, int position, long id) {        Toast.makeText(getApplicationContext(), ((TextView) v).getText(), Toast.LENGTH_SHORT).show();    }}```**ListViewActivity3**<div class="se-preview-section-delimiter"></div>

这里写代码片
“`

package com.sjm.gridviewAndListview;import com.sjm.gridview.R;import android.app.Activity;import android.os.Bundle;import android.widget.ArrayAdapter;import android.widget.ListView;public class ListViewActivity3 extends Activity {    private ListView lv;    @Override    protected void onCreate(Bundle savedInstanceState) {        // TODO Auto-generated method stub        super.onCreate(savedInstanceState);        setContentView(R.layout.listview3_layout);        lv = (ListView) findViewById(R.id.lv);        String arr[] = getResources().getStringArray(R.array.name);        // 单选模式        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_single_choice,                arr);        lv.setChoiceMode(ListView.CHOICE_MODE_SINGLE);        // 多选模式        // ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,        // android.R.layout.simple_list_item_multiple_choice, arr);        // lv.setChoiceMode(ListView.CHOICE_MODE_MULTIPLE);        lv.setAdapter(adapter);    }}```**ListViewNotifyDataSetChanged**package com.sjm.gridviewAndListview;import java.util.Vector;import java.util.logging.LogRecord;import com.sjm.gridview.R;import com.sjm.gridview.entity.News;import android.app.Activity;import android.os.Bundle;import android.os.Handler;import android.os.Message;import android.view.View;import android.view.ViewGroup;import android.widget.AbsListView;import android.widget.AbsListView.OnScrollListener;import android.widget.BaseAdapter;import android.widget.ListView;import android.widget.TextView;/** * listview 分页加载 *  * @author sjm * */public class ListViewNotifyDataSetChanged extends Activity implements OnScrollListener {    private ListView lv_listview;    private Vector<News> news = new Vector<News>();    private MyAdapter myAdapter;    /** 数据更新完成之后的标记 */    private static final int DATA_UPDATE = 0x1;// Ctrl+Shift+X Ctrl+Shift+Y    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.notifydatasetchanged_layout);        lv_listview = (ListView) findViewById(R.id.lv_listview);        /** 滚动监听 */        lv_listview.setOnScrollListener(this);        /** 加载尾部 布局 */        View footerView = getLayoutInflater().inflate(R.layout.loading, null);        // lv_listview.addHeaderView(headerView);        lv_listview.addFooterView(footerView);        initData();        myAdapter = new MyAdapter();        lv_listview.setAdapter(myAdapter);    }    private int index = 1;    /**     * 初始化数据     */    private void initData() {        for (int i = 0; i < 100; i++) {            News n = new News();            n.setTitle("title--" + index);            n.setContent("content--" + index);            index++;            news.add(n);        }    }    /**     * 线程之间通讯的机制     */    Handler handler = new Handler() {        @Override        public void handleMessage(Message msg) {            switch (msg.what) {            case DATA_UPDATE:                myAdapter.notifyDataSetChanged();                break;            }        };    };    /**     * 开线程模拟加载数据     *      * @author sjm     *     */    class LoadDataThread extends Thread {        @Override        public void run() {            initData();            try {                Thread.sleep(2000);            } catch (InterruptedException e) {                e.printStackTrace();            }            // myAdapter.notifyDataSetChanged();            // 通过handler给主线程发送消息标记            handler.sendEmptyMessage(DATA_UPDATE);        }    }    /**     * 自定义适配器     *      * @author sjm     *     */    class MyAdapter extends BaseAdapter {        @Override        public int getCount() {            return news.size();        }        @Override        public Object getItem(int position) {            return news.get(position);        }        @Override        public long getItemId(int position) {            return position;        }        @Override        public View getView(int position, View convertView, ViewGroup parent) {            ViewHolder vh = null;            if (convertView == null) {                convertView = getLayoutInflater().inflate(R.layout.notifydatasetchanged_item, null);                vh = new ViewHolder();                vh.tv_content = (TextView) convertView.findViewById(R.id.tv_content);                vh.tv_title = (TextView) convertView.findViewById(R.id.tv_title);                convertView.setTag(vh);            } else {                vh = (ViewHolder) convertView.getTag();            }            News n = news.get(position);            vh.tv_title.setText(n.getTitle());            vh.tv_content.setText(n.getContent());            return convertView;        }        class ViewHolder {            TextView tv_title;            TextView tv_content;        }    }    private int visibleLastIndex;// 可显示的最后一条数据的索引值    /**     * 滚动状态:SCROLL_STATE_FLING:正在滚动 SCROLL_STATE_IDLE:没有滚动,空闲 TOUCH_SCROLL:在滚动条上     *      * @param view     * @param scrollState     */    @Override    public void onScrollStateChanged(AbsListView view, int scrollState) {        if (myAdapter.getCount() == visibleLastIndex && scrollState == OnScrollListener.SCROLL_STATE_IDLE) {            new LoadDataThread().start();        }    }    /**     * 正在滚动     *      * @param view     * @param firstVisibleItem     *            第一条数据     * @param visibleItemCount     *            总数据     * @param totalItemCount     *      */    @Override    public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) {        visibleLastIndex = firstVisibleItem + visibleItemCount - 1;    }}**实体类    News**<div class="se-preview-section-delimiter"></div>

这里写代码片
“`

package com.sjm.gridview.entity;/** *  * @author sjm * */public class News {    private String title;    private String content;    public String getTitle() {        return title;    }    public void setTitle(String title) {        this.title = title;    }    public String getContent() {        return content;    }    public void setContent(String content) {        this.content = content;    }}

ExpandableListviewActivity

package com.sjm.expandableListview;

import com.sjm.gridview.R;

import android.app.Activity;
import android.app.ExpandableListActivity;
import android.os.Bundle;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.ExpandableListView.OnChildClickListener;
import android.widget.ExpandableListView.OnGroupClickListener;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

/**
* 可扩展的listview :ExpandableListView
*
* @author sjm
*
*/
public class ExpandableListviewActivity extends Activity {

private ExpandableListView expandableListview;@Overrideprotected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.expandablel_layout);    expandableListview = (ExpandableListView) findViewById(R.id.expandableListview);    expandableListview.setAdapter(new MyExpandableAdapter());    /**     * 点击子item事件     */    expandableListview.setOnChildClickListener(new OnChildClickListener() {        @Override        public boolean onChildClick(ExpandableListView parent, View v, int groupPosition, int childPosition,                long id) {            Toast.makeText(getApplicationContext(), childs[groupPosition][childPosition], Toast.LENGTH_SHORT)                    .show();            return true;        }    });}private static String groups[] = { "好友", "黑名单" };private static String childs[][] = { { "老大", "老二"}, { "老三", "老四" } };/** * 适配器 *  * @author sjm * */class MyExpandableAdapter extends BaseExpandableListAdapter {    /**     * 组的总数----------->也就是父item的长度     */    @Override    public int getGroupCount() {        return groups.length;    }    /**     * 子类的总数----->子item的长度     */    @Override    public int getChildrenCount(int groupPosition) {        return childs.length;    }    /**     * 获取父item的每一个位置     */    @Override    public Object getGroup(int groupPosition) {        return groups[groupPosition];    }    /**     * 获取子item的每一个位置     */    @Override    public Object getChild(int groupPosition, int childPosition) {        return childs[groupPosition][childPosition];    }    /**     * 获取父item的每一个选项     */    @Override    public long getGroupId(int groupPosition) {        return groupPosition;    }    /**     * 获取子item的每一个选项     */    @Override    public long getChildId(int groupPosition, int childPosition) {        return childPosition;    }    @Override    public boolean hasStableIds() {        // TODO Auto-generated method stub        return false;    }    /**     *      */    @Override    public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {        GroupViewHolder vh;        if (convertView == null) {            convertView = getLayoutInflater().inflate(R.layout.expandable_group_layout, null);            vh = new GroupViewHolder();            vh.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);            vh.tv_title = (TextView) convertView.findViewById(R.id.tv_title);            convertView.setTag(vh);        } else {            vh = (GroupViewHolder) convertView.getTag();        }        // vh.iv_icon.setImageResource(resId);        vh.tv_title.setText(groups[groupPosition]);        return convertView;    }    @Override    public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView,            ViewGroup parent) {        ChildViewHolder vh;        if (convertView == null) {            convertView = getLayoutInflater().inflate(R.layout.expandable_group_layout, null);            vh = new ChildViewHolder();            vh.iv_icon = (ImageView) convertView.findViewById(R.id.iv_icon);            vh.tv_title = (TextView) convertView.findViewById(R.id.tv_title);            convertView.setTag(vh);        } else {            vh = (ChildViewHolder) convertView.getTag();        }        // vh.iv_icon.setImageResource(resId);        vh.tv_title.setText(childs[groupPosition][childPosition]);        return convertView;    }    /**     * 二级选项是否可以被选中     */    @Override    public boolean isChildSelectable(int groupPosition, int childPosition) {        return true;    }    class GroupViewHolder {        ImageView iv_icon;        TextView tv_title;    }    class ChildViewHolder {        ImageView iv_icon;        TextView tv_title;    }}

}

xml
activity_main

<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"    android:paddingBottom="@dimen/activity_vertical_margin" >    <GridView        android:id="@+id/gridView"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_gravity="center"        android:columnWidth="90dp"        android:horizontalSpacing="10dp"        android:numColumns="auto_fit"        android:stretchMode="columnWidth"        android:verticalSpacing="10dp" >    </GridView></LinearLayout>

listview1_layout

<?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" >    <ImageView        android:id="@+id/iv_item"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@drawable/sample_0" />    <TextView        android:id="@+id/tv_item"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="1" /></LinearLayout>```**loading**<div class="se-preview-section-delimiter"></div>

这里写代码片
“`

<?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="horizontal"    android:layout_marginTop="10dp"    android:gravity="center_horizontal" >    <ProgressBar        android:id="@+id/progress_load"        style="?android:attr/progressBarStyleSmall"        android:layout_width="wrap_content"        android:layout_height="wrap_content" />    <TextView        android:id="@+id/tv_load"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="正在玩命加载中..."        android:textAppearance="?android:attr/textAppearanceSmall" /></LinearLayout>```**notifydatasetchanged_item**<div class="se-preview-section-delimiter"></div>

<?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="horizontal" >    <TextView        android:id="@+id/tv_title"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:text="title" />    <TextView        android:id="@+id/tv_content"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:layout_marginLeft="10dp"        android:text="content" /></LinearLayout>

notifydatasetchanged_layout

1 0
原创粉丝点击