Android复杂自定义Listview实现

在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记)。

可参考博客:http://cinderella7.blog.51cto.com/7607653/1281696 
(这里用MVC的思想去理解Listview,个人认为还是不错的)

      http://blog.csdn.net/jueblog/article/details/11857281 
 (一个完整的实现)

--------------------------------------------------------------------------分割线-----------------------------------------------------------------

一、理顺整个思路。

自定义Listview中包含三个重要概念,这里用MVC的形式去理解:  

  ListView相当于MVC框架中的V(视图)

  Adapter相当于MVC框架中的C(控制器)

  数据源相当于MVC框架中的M(模型)

二、一步一步实现

  1、先自定义listview中每个Item子项的布局

listitem.xml


<?xml version="1.0" encoding="utf-8"?>

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

<ImageView
android:layout_width="fill_parent"
android:layout_height="100dp"
android:id="@+id/imageView"/>
<TextView
android:layout_width="fill_parent"
android:layout_height="wrap_content"
android:textAppearance="?android:attr/textAppearanceLarge"
android:text="Large Text"
android:id="@+id/textView"/>
</LinearLayout>

  2、定义主布局


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

  3、然后,定义数据源、视图、适配器

    private List<HashMap<String,Object>> mData;  //M
private ListView listView; //V
private MyAdapter myAdapter; //C

  4、获取数据源


private List<HashMap<String,Object>> getData(){
ArrayList<HashMap<String,Object>> arrayList = new ArrayList<HashMap<String, Object>>();
HashMap<String,Object> hashMap = null;
for(int i=0;i<10;i++){
hashMap = new HashMap<String, Object>();
hashMap.put("index",Integer.toString(i+1));
hashMap.put("img",R.drawable.my);
arrayList.add(hashMap); //添加到数据源中
}
return arrayList;
}

  5、自定义适配器,添加数据源到适配器中


//创建自定义adapter
private class MyAdapter extends BaseAdapter{
private LayoutInflater mlayoutInflater;

      
public MyAdapter(Context context) {
mlayoutInflater = LayoutInflater.from(context); //动态布局映射
}

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

@Override
public Object getItem(int position) {
return null;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mlayoutInflater.inflate(R.layout.listitem, null); // 根据布局文件实例化view
TextView tv = (TextView)convertView.findViewById(R.id.textView);
tv.setText(mData.get(position).get("index").toString());
ImageView img = (ImageView)convertView.findViewById(R.id.imageView);
img.setBackgroundResource((Integer)mData.get(position).get("img"));
return convertView;
}
}

  6、在onCreate函数中实施

        listView = (ListView)findViewById(R.id.listView);
//----
mData = getData();
myAdapter = new MyAdapter(this);
listView.setAdapter(myAdapter);

三、总结

  整个实现流程都严格按照MVC的模式去做,首先是自定义自己的元素布局,然后获取数据源,然后重写适配器,加载数据源到适配器中,通过listview显示适配器内容。

以下附上Java代码完整版:


package com.example.ListViewTest;

import android.app.Activity;
import android.content.Context;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.ListView;
import android.widget.TextView;

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

public class MyActivity extends Activity {
/**
* Called when the activity is first created.
*/
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);

listView = (ListView)findViewById(R.id.listView);
//----
mData = getData();
myAdapter = new MyAdapter(this);
listView.setAdapter(myAdapter);
}

private List<HashMap<String,Object>> mData; //M
private ListView listView; //V
private MyAdapter myAdapter; //C

private List<HashMap<String,Object>> getData(){
ArrayList<HashMap<String,Object>> arrayList = new ArrayList<HashMap<String, Object>>();
HashMap<String,Object> hashMap = null;
for(int i=0;i<10;i++){
hashMap = new HashMap<String, Object>();
hashMap.put("index",Integer.toString(i+1));
hashMap.put("img",R.drawable.my);
arrayList.add(hashMap); //添加到数据源中
}
return arrayList;
}

//创建自定义adapter
private class MyAdapter extends BaseAdapter{
private LayoutInflater mlayoutInflater;

public MyAdapter(Context context) {
mlayoutInflater = LayoutInflater.from(context); //动态布局映射
}

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

@Override
public Object getItem(int position) {
return null;
}

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

@Override
public View getView(int position, View convertView, ViewGroup parent) {
convertView = mlayoutInflater.inflate(R.layout.listitem, null); // 根据布局文件实例化view
TextView tv = (TextView)convertView.findViewById(R.id.textView);
tv.setText(mData.get(position).get("index").toString());
ImageView img = (ImageView)convertView.findViewById(R.id.imageView);
img.setBackgroundResource((Integer)mData.get(position).get("img"));
return convertView;
}
}
}

Android复杂自定义Listview实现,布布扣,bubuko.com

时间: 2024-11-08 00:37:14

Android复杂自定义Listview实现的相关文章

Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案

如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView 的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为 false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了 我们可以通过对Item Layout的根控件设置其android:descendantFocusability="blo

【Android】自定义listview快速滚动条

http://blog.csdn.net/xyang81/article/details/17680333 在eoe上看到有个贴子通过反射,动态修改FastScroller对象的mThumbDrawable属性来改变快速滑动块的图标,这也不为于一种实现方式,但反射的效率较低.下面将介绍使用Style的方式来自定义图标. 从FastScroller类的init方法中可以得知,mThumbDrawable是通过获取当前Activity主题的android.R.attr.fastScrollThumb

Android中自定义ListView实现上拉加载更多和下拉刷新

ListView是Android中一个功能强大而且很常用的控件,在很多App中都有ListView的下拉刷新数据和上拉加载更多这个功能.这里我就简单记录一下实现过程. 实现这个功能的方法不止一个,GitHub上有一些开源库可以使用,但是本着学习的精神,我做的是使用自定义ListView实现这个功能. 思路:谷歌提供的ListView是不能提供下拉刷新和下拉加载的,所以我们就需要重写ListView.在ListView的头部和尾部加上我们的布局文件(progressbar). 先说上拉加载更多实现

Android之自定义ListView(一)

PS:自定义View是Android中高手进阶的路线.因此我也打算一步一步的学习.看了鸿洋和郭霖这两位大牛的博客,决定一步一步的学习,循序渐进. 学习内容: 1.自定义View实现ListView的Item左右滑动显示和隐藏弹窗的效果   自定义View其实是在Android学习路上比较难掌握的一个重要点,但是也是高手的必经之路,自定义View分为很多种,我们可以直接继承View,或者是继承他的直接子类或间接子类.ViewGroup,ListView,LinearLayout,Button等等.

android 安卓自定义listview实现下拉刷新

[1].重写listView public class MyListView extends ListView implements OnScrollListener {          private final static int RELEASE_To_REFRESH = 0;// 下拉过程的状态值       private final static int PULL_To_REFRESH = 1; // 从下拉返回到不刷新的状态值       private final static

【Android UI】ListView系列二(自定义Adapter订阅新闻栏目)

目标:自定义适配器Adapter实现点击每个item订阅按钮 上一篇介绍了listview的基本属性以及ArrayAdapter和SimpleAdapter的简单实用,链接:listview使用方式基础篇. 今天主要介绍一下自定义adapter,来实现稍微复杂点的功能,今天实现的效果是:类似于listiew展示许多可供订阅的栏目,每个栏目最右端有订阅按钮,用户点击订阅可以订阅该栏目,再次点击可取消订阅,效果图如下,下面我们一步步来实现. 1. 定义主布局文件activity_main.xml 主

android之ListView,详细介绍实现步骤,举例,自定义listview适配器

android之ListView,详细介绍实现步骤,举例,自定义listview适配器 09. 四 / android基础 / 没有评论 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listView是比较重要的,因为很多时候都需要将数据库中的数据以列表显示, 具体使用步骤:大体 1,建立一个item.xml文件,此布局文件布局布局如何具体显示列表中的每一个条目 2,在要使用listview的界面中添加listview控件. 3,activit

android开发最常用例子整理----(3)自定义ListView(自定义BaseAdapter实现)

在上一个教程中,我们使用SimpleAdapter实现自定义ListView,但是有一点不方便的是,如果要对每一个ListView的item选项进行不同的样式设置,就很麻烦,因为SimpleAdapter使用的是统一的风格样式.如果要实现不同item使用不同的风格样式,那么就要通过集成BaseAdapter来实现. 一.Activity MainActivity.java源码: public class MainActivity extends Activity { @Override prot

android开发(33) 自定义 listView的分割线( 使用xml drawable画多条线)

我遇到这样一个场景,我需要自定义 listView的分割线,而这个分割线是由两条线组成的,在使用xml drawable时遇到了困难. 注释:画两条线是为了实现 凹陷的效果,在绘图中一条暗线紧跟着一条明显会给人视觉上产生明显的“沟”的感觉. 因为我的背景是透明(背景渐变)的,直接用图片来实现效果不好. 看看效果: 使用 layer-list 来实现. layer-list 可以包含多个item,每个item堆叠在一起. layer-list  的item可以设置 间距,使用  android:b