GVKun编程网logo

[android] 练习使用ListView(三)(android listview的用法)

11

最近很多小伙伴都在问[android]练习使用ListView和三这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展027Android可扩展的listview:Expandable

最近很多小伙伴都在问[android] 练习使用ListView这两个问题,那么本篇文章就来给大家详细解答一下,同时本文还将给你拓展027 Android 可扩展的 listview:ExpandableListView 的使用案例、android - ListView(1)、android - ListView(2)、Android ArrayList ListView / Textview-您必须为textview提供资源ID等相关知识,下面开始了哦!

本文目录一览:

[android] 练习使用ListView(三)(android listview的用法)

[android] 练习使用ListView(三)(android listview的用法)

解决OOM和图片乱序问题

package com.android.test;

import java.io.InputStream;
 java.net.HttpURLConnection;
 java.net.URL;

 com.nostra13.universalimageloader.core.ImageLoader;
 com.nostra13.universalimageloader.core.ImageLoaderConfiguration;
 com.nostra13.universalimageloader.core.assist.FailReason;
 com.nostra13.universalimageloader.core.listener.ImageLoadingListener;

 android.app.Activity;
 android.graphics.Bitmap;
 android.graphics.BitmapFactory;
 android.graphics.drawable.BitmapDrawable;
 android.os.AsyncTask;
 android.os.Bundle;
 android.support.v4.util.LruCache;
 android.view.View;
 android.view.ViewGroup;
 android.widget.BaseAdapter;
 android.widget.ImageView;
 android.widget.listadapter;
 android.widget.ListView;
 android.widget.TextView;

public class MainActivity extends Activity {
    private ListView lv_images;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        lv_images = (ListView) findViewById(R.id.lv_images);
        
        ImageLoaderConfiguration configuration=ImageLoaderConfiguration.createDefault(this);
        ImageLoader.getInstance().init(configuration);
        
        listadapter adapter = new ImageAdapter();
        lv_images.setAdapter(adapter);
    }
    /**
     * 适配器
     * @author taoshihan
     *
     */
    class ImageAdapter  BaseAdapter {
         ListView mListView;
        private LruCache<String,BitmapDrawable> mImageCache;
        public ImageAdapter() {
            int maxSize=(int) (Runtime.getRuntime().maxMemory()/1024)/8;
            mImageCache=new LruCache<String,1)">(maxSize){
                int sizeOf(String key,BitmapDrawable drawable) {
                    return drawable.getBitmap().getByteCount()/1024; 
                };
            };
        }
        @Override
        public View getView( position,View convertView,ViewGroup parent) {
            //第三个参数就是ListView
            if(mListView==null){
                mListView=(ListView) parent;
            }
            
            String url=(String) getItem(position);
            View view;
            if(convertView!=){
                view=convertView;
            }else{
                view=View.inflate(getApplicationContext(),R.layout.image_item,);
            }
            ImageView imageView=(ImageView) view.findViewById(R.id.tv_image);
            给ImageView设置标签
            imageView.setTag(url);
            BitmapDrawable bitmapDrawable=getBitmapFromMemoryCache(url);
            if(bitmapDrawable!=){
                读取缓存图片
                imageView.setimageDrawable(bitmapDrawable);
            }{
                读取网络图片
                ImageWorkerTask task= ImageWorkerTask(mListView,url);
                task.execute(url);
            }
            return view;
        }
        
         * 从缓存中读取图片
         * @param key
         * @return 
         */
         BitmapDrawable getBitmapFromMemoryCache(String key) {
            if(mImageCache.get(key)!= mImageCache.get(key);
            }
            return ;
        }
         addBitmapToMemoryCache(String key,BitmapDrawable drawable){
            if(getBitmapFromMemoryCache(key)==){
                mImageCache.put(key,drawable);
            }
        }
        @Override
         getCount() {
             Todo Auto-generated method stub
             Images.IMAGE_URLS.length;
        }

        @Override
        public Object getItem( position) {
             Images.IMAGE_URLS[position];
        }

        @Override
        long getItemId( position;
        }
        
         * 异步任务
         *  taoshihan
         *
         class ImageWorkerTask extends AsyncTask<String,Void,1)">{
             ImageView imageView;
             ImageWorkerTask(ListView parent,String imageUrl) {
                在ListView中通过标签找到ImageView控件
                this.imageView=(ImageView) parent.findViewWithTag(imageUrl);
            }
            @Override
            protected BitmapDrawable doInBackground(String... params) {
                String imageUrl=params[0];
                Bitmap bitmap=downLoadBitmap(imageUrl);
                BitmapDrawable drawable= BitmapDrawable(getApplicationContext().getResources(),bitmap);
                addBitmapToMemoryCache(imageUrl,drawable);
                 drawable;
            }
            下载图片
             Bitmap downLoadBitmap(String imageUrl) {
                Bitmap bitmap=;
                try {
                    URL url= URL(imageUrl);
                    HttpURLConnection conn=(HttpURLConnection) url.openConnection();
                    conn.setConnectTimeout(10000);
                    InputStream is=conn.getInputStream();
                    bitmap=BitmapFactory.decodeStream(is);
                } catch (Exception e) {
                }
                 bitmap;
            }
            下载完成的
            @Override
             onPostExecute(BitmapDrawable result) {
                if(imageView!=null&&result!=){
                    imageView.setimageDrawable(result);
                }
            }
            
        }

    }
    static class Images{
        final static String[] IMAGE_URLS =  String[]{
            "http://img.my.csdn.net/uploads/201508/05/1438760758_3497.jpg","http://img.my.csdn.net/uploads/201508/05/1438760758_6667.jpg"
        };
    }
}

 

027 Android 可扩展的 listview:ExpandableListView 的使用案例

027 Android 可扩展的 listview:ExpandableListView 的使用案例

1.ExpandableListView 简介

ExpandableListView 是一种用于垂直滚动展示两级列表的视图,和 ListView 的不同之处就是它可以展示两级列表,分组可以单独展开显示子选项。这些选项的数据是通过 ExpandableListAdapter 关联的。

2.xml 页面布局

(1) 主界面布局 (CommonNumberQueryActivity 对应布局)

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical"
    tools:context=".CommonNumberQueryActivity">

    <TextView
        style="@style/TitleStyle"
        android:text="常用号码查询" />

    <!--可以扩展的listview:ExpandableListView-->
    <ExpandableListView
        android:id="@+id/elv_common_number"
        android:layout_width="match_parent"
        android:layout_height="wrap_content">

    </ExpandableListView>
</LinearLayout>

(2)elv_child_item_group.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:padding="5dp"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv_group_name"
        android:text="分组名称"
        android:layout_marginLeft="40dp"
        android:textSize="16sp"
        android:textColor="@color/red"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>


</LinearLayout>

(3)elv_child_item_child.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:padding="5dp"
    android:orientation="vertical" >
    <TextView
        android:id="@+id/tv_name"
        android:text="电话名称"
        android:textSize="16sp"
        android:textColor="#000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>
    <TextView
        android:id="@+id/tv_number"
        android:text="电话号码"
        android:textSize="16sp"
        android:textColor="#000"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"/>

</LinearLayout>

3.java 后台代码

package com.example.administrator.test62360safeguard;

import android.graphics.Color;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.TypedValue;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseExpandableListAdapter;
import android.widget.ExpandableListView;
import android.widget.TextView;

import com.example.administrator.test62360safeguard.engine.CommonNumberDao;

import java.util.List;

public class CommonNumberQueryActivity extends AppCompatActivity {

    ExpandableListView elv_common_number;
    List<CommonNumberDao.Group> groupList;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_common_number_query);
        initUI();
        initData();
    }

    /**
     * 给可扩展的listview:ExpandableListView准备数据,并填充
     * 首先将对应的数据库文件放入assets目录下
     */
    private void initData() {
        CommonNumberDao commonNumberDao=new CommonNumberDao();
        //获取数据库中的数据
        groupList = commonNumberDao.getGroup();
        System.out.println("groupList:"+groupList);
        //给ExpandableListView设置数据适配器
        elv_common_number.setAdapter(new MyAdapter());
    }

    private void initUI() {
        elv_common_number = findViewById(R.id.elv_common_number);
    }

    private class MyAdapter extends BaseExpandableListAdapter {
        @Override
        public int getGroupCount() {
            return groupList.size();
        }

        @Override
        public int getChildrenCount(int groupPosition) {
            return groupList.get(groupPosition).childList.size();
        }

        @Override
        public CommonNumberDao.Group getGroup(int groupPosition) {
            return groupList.get(groupPosition);
        }

        @Override
        public CommonNumberDao.Child getChild(int groupPosition, int childPosition) {
            return groupList.get(groupPosition).childList.get(childPosition);
        }

        @Override
        public long getGroupId(int groupPosition) {
            return groupPosition;
        }

        @Override
        public long getChildId(int groupPosition, int childPosition) {
            return childPosition;
        }

        /**
         * 固定写法不需要修改
         */
        @Override
        public boolean hasStableIds() {
            return false;
        }

        @Override
        public View getGroupView(int groupPosition, boolean isExpanded, View convertView, ViewGroup parent) {
            View view = View.inflate(getApplicationContext(), R.layout.elv_child_item_group, null);
            TextView tv_group_name = view.findViewById(R.id.tv_group_name);
            tv_group_name.setText(getGroup(groupPosition).name);
            return view;
        }

        @Override
        public View getChildView(int groupPosition, int childPosition, boolean isLastChild, View convertView, ViewGroup parent) {
            View view = View.inflate(getApplicationContext(), R.layout.elv_child_item_child, null);
            TextView tv_name = view.findViewById(R.id.tv_name);
            TextView tv_number = view.findViewById(R.id.tv_number);
            tv_name.setText(getChild(groupPosition, childPosition).name);
            tv_number.setText(getChild(groupPosition, childPosition).number);
            return view;
        }

        /**
         * @return 孩子节点是否响应事件
         */
        @Override
        public boolean isChildSelectable(int groupPosition, int childPosition) {
            return false;
        }
    }
}

4. 效果图

 

android - ListView(1)

android - ListView(1)

一、常用属性

属性名称说明
divider设置分割线颜色
dividerHeight设置分割线高度
scrollbar设置滚动条的隐藏或者显示
fadeScrollbars设置滚动条的自动隐藏或者显示
entries引用一个将使用在此ListView里的数组。若数组是固定的,使用此属性将比在程序中写入更为简单

二、实现ListView的一般步骤

  • 在布局文件中编写代码(xml)

    添加ListView标签
  • 在Activity中编写代码(java)

    1. 获取ListView对象
    2. 准备数据源(Array数组)
    3. 配置适配器(ArrayAdatper)
    4. 将适配器关联到ListView

三、什么是适配器

适配器是数据和试图之间的桥梁,他负责把数据所提供的内容显示到视图所定义的外观中。
image.png

四、适配器的种类

名称说明
ArrayAdapter适用于简单的文字列表
SimpleAdapter适用于简单的图文混搭列表
SimpleCursorAdapter适用于数据源是数据库的列表
自定义Adapter(继承自BaseAdapter)最灵活的适配器,适用于绝大多数情况
  • 注意:ArrayAdapter、SimpleAdapetr和SimpleCursorAdapter也是继承自BaseAdapter。

1. ArrayAdapter实现简单的文字列表

// 1. 通过反射为listview对象
        ListView lv = findViewById(R.id.lv_main);
        // 2. 数据源
        String[] data = {
                "初始android",
                "基础控件",
                "入云龙公孙胜",
                "禁军教头王进",
                "初始android",
                "花和尚露真身"
        };
        // 3. 设置适配器
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(
                this,
                android.R.layout.simple_list_item_1,
                data
        );

        lv.setAdapter(adapter);

2. SimpleAdapter实现图文混编列表

2.1  在布局文件中编写代码
    * 添加ListView标签(main.xml)
    * 编写布局文件(item.xml)
2.2 在Activity中编写代码
    * 获取ListView对象
    * 准备数据源(List<Map>)
    * 配置适配器(SimpleAdapter)
    * 将适配器关联到ListView

总结

ListView是数据显示最常见形式
Adapter是ListView与数据之间的桥梁
ArrayAdapter适用于简单文字列表
SimpleAdapter适用于图文混搭列表,需要提供自定义的行布局eg:item.xml
当行布局出现按钮时,需设置
android:descendantFocusability="blocksDescendants"属性,使行优先获得焦点。

android - ListView(2)

android - ListView(2)

一、 目标

  1. 掌握实现自定义适配器的方法
  2. 学会使用自定义适配器实现图文混搭列表
  3. 理解自定义适配器原理
  4. 学会使用Selector北京选择器

二、自定义Adapter

  1. 继承BaseAdapter
  2. 实现getView
  3. 关联ListView

image.png

代码

public class MyAdapter extends BaseAdapter {

    /**
     * 数据集和
     */
    List<Map<String, Object>> list;

    /**
     * 布局反射器(布局文件反射未布局对象)
     */
    LayoutInflater inflater;

    /**
     * 构造器
     */
    public MyAdapter(Context context){
        this.inflater = LayoutInflater.from(context);
    }

    /**
     * 传入数据集合
     */
    public void setList(List<Map<String, Object>> list){
        this.list = list;
    }


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

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

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

    @Override
    public View getView(int position, View convertView, ViewGroup viewGroup) {
        View view = inflater.inflate(R.layout.item, null);
        ImageView logo = view.findViewById(R.id.logo);
        TextView title = view.findViewById(R.id.title);
        TextView version = view.findViewById(R.id.version);
        TextView size = view.findViewById(R.id.size);

        Map<String, Object> map = list.get(position);
        logo.setImageResource((Integer)map.get("logo"));
        title.setText((String)map.get("title"));
        title.setText((String)map.get("title"));
        size.setText((String)map.get("size"));

        return view;
    }
}
调用
// 自定义Adapter
        MyAdapter myAdapter = new MyAdapter(this);
        myAdapter.setList(list);

三、ListView点击事件

名称说明
onItemClickItem项点击事件
onItemLongClickItem项长按事件
在onCreate中:
 lv.setOnItemClickListener(this);
 lv.setOnItemLongClickListener(this);
 @Override
    public void onItemClick(AdapterView<?> adapterView, View view, int position, long l) {
        Toast.makeText(this, "点击"+position, Toast.LENGTH_SHORT).show();
    }

    @Override
    public boolean onItemLongClick(AdapterView<?> adapterView, View view, int position, long l) {
        Toast.makeText(this, "长按"+position,  Toast.LENGTH_SHORT);
        return true;
    }
四、事件的消化
名称说明
true表示消化掉事件,事件不会再继续传递
false表示事件不消化,继续往下传递

五、选中背景切换的问题

问题:
  • Item项选中后的背景颜色是否可以自定义?
  • Button按钮点击后的背景图是否可以自定义?
答案(用Selector背景选择器实现以上效果)

六、Selector背景选择器

  • 是drawable文件夹下的一种资源文件(.xml)
  • 在其中可以定义多种不同状态下的控件背景
  • 常用的状态如下表所示
名称说明
android:state_pressed控件是否被按压
android:state_focus控件是否获得焦点
android:state_selected空间是否被选中
android:state_enabled控件是否可用

总结

  • 自定义适配器是应用最广的适配器,需要继承BaseAdapter,并重写方法
  • 自定义适配器的核心方法是getView(),在该方法中通过LayoutInflater反射出行布局对象,并填充上数据内容
  • ListView最重要的时间是item的点击事件和长按事件,同一时间内如果只想触发一个事件,可以再长安处理的最后返回true。
  • 在android中,可以通过Selector来实现控件背景的自动切换。

Android ArrayList ListView / Textview-您必须为textview提供资源ID

Android ArrayList ListView / Textview-您必须为textview提供资源ID

我曾经在某一时刻进行过这项工作,所以我认为我所引用的东西有误。_regionListView似乎返回确定。我认为ArrayList中的数组是问题,因为它包含额外的空索引,但我认为我没有正确连接到ListView和TextView。

任何帮助,将不胜感激。

Main.java

String _region = inRegion;
    ParserRegion _parserRegion = new ParserRegion();
    InputStream _inputStream = getResources().openRawResource(R.raw.regions);

    // Parse the Input Stream
    _parserRegion.Parse(_inputStream,_region);

    // Get Regions
    List<PropertiesRegion> _regionList = _parserRegion.GetList();

    // Create the ArrayAdapter
    ArrayAdapterRegion _arrayAdapter = new ArrayAdapterRegion(getApplicationContext(),R.layout.search_list,_regionList);

    // Get reference to ListView holder
    ListView _regionListView = (ListView) this.findViewById(R.id.regionListView);

    // Set the ListView adapter
    _regionListView.setAdapter(_arrayAdapter);

Search.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:adjustViewBounds="true"
    android:background="@drawable/search_background"
    android:gravity="center"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" 
    android:scaleType="centerCrop" >

    <TextView
        android:id="@+id/selectRegionTextView"
        android:cacheColorHint="#00000000"
        android:layout_width="wrap_content"
        android:layout_height="30dp" 
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:layout_marginTop="150dip"
        android:gravity="top"
        android:textColor="#000000"
        android:textSize="20dip"
        android:textandroid:typeface="sans" />

    <ListView 
        android:id="@+android:id/regionListView"
        android:cacheColorHint="#00000000" 
        android:layout_width="fill_parent"
        android:layout_height="fill_parent"
        android:layout_marginBottom="5dip"
        android:layout_marginLeft="10dip"
        android:layout_marginRight="10dip"
        android:padding="10dp" />

    <Button
        android:id="@+id/mainMenuButton"
        android:background="@drawable/button_black"
        android:layout_width="match_parent"
        android:layout_height="50dp"
        android:layout_marginBottom="70dip"
        android:layout_marginLeft="20dip"
        android:layout_marginRight="20dip"
            android:typeface="sans"
            android:textSize="18dip"
            android:textandroid:textColor="@android:color/white"/>

</LinearLayout>

Search_list.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content">

    <TextView
        android:id="@+id/regionTextView"
        android:cacheColorHint="#00000000"
        android:gravity="center"
        android:layout_gravity="left"
        android:layout_width="wrap_content"
        android:layout_height="60dp" 
        android:paddingLeft="10dip"
        android:textColor="#000000"
        android:typeface="sans"
        android:textSize="20dip"
        android:text/>

</LinearLayout>

今天关于[android] 练习使用ListView的分享就到这里,希望大家有所收获,若想了解更多关于027 Android 可扩展的 listview:ExpandableListView 的使用案例、android - ListView(1)、android - ListView(2)、Android ArrayList ListView / Textview-您必须为textview提供资源ID等相关知识,可以在本站进行查询。

本文标签: