ListView自定义

ListView网上资料很多,我所知扩展性最好、最通用的代码做个备忘。

总体上来讲:ListView+BaseAdapter+xml文件实现:

话不多说,先贴个图,预期效果如下:

首先:这样一个ListView的item包含:图片、文字,而且布局也比较复杂。首选自定义这样一个模版的xml文件。

第一步、主方法lin.xml,加一个listveiw布局

<?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:background="#FFFFFF"
    android:orientation="vertical" >
    <ListView
	    android:id="@+id/lst_v"
	    android:layout_width="match_parent"
	    android:layout_height="match_parent"
	    ></ListView>
</LinearLayout>

第二步:自定义item.xml(写Demo有些懒,稍微简化了几个textview)

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#ffffff" >

    <ImageView
        android:id="@+id/img_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:background="@drawable/img_1" />

    <TextView
        android:id="@+id/title_1"
        android:layout_width="130dp"
        android:layout_height="wrap_content"
        android:layout_toRightOf="@+id/img_1"
        android:gravity="left"
        android:paddingLeft="10dp"
        android:paddingTop="10dp"
        android:text="豫蜀房河南烩面"
        android:textColor="#000000"
        android:singleLine="true"
        android:textSize="16sp" />

    <ImageView
        android:id="@+id/img_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="8dp"
        android:layout_marginTop="8dp"
        android:layout_toRightOf="@+id/title_1"
        android:background="@drawable/img_2" />

    <ImageView
        android:id="@+id/img_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginLeft="4dp"
        android:layout_marginTop="8dp"
        android:layout_toRightOf="@+id/img_2"
        android:background="@drawable/img_3" />

    <ImageView
        android:id="@+id/score"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/title_1"
        android:layout_marginLeft="6dp"
        android:layout_marginTop="6dp"
        android:layout_toRightOf="@+id/img_1"
        android:background="@drawable/score" />

    <TextView
        android:id="@+id/address"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/score"
        android:layout_toRightOf="@+id/img_1"
        android:paddingLeft="12dp"
        android:paddingTop="10dp"
        android:text="快餐 五棵松"
        android:textSize="14sp" />

    <View
        android:layout_width="match_parent"
        android:layout_height="0.2dp"
        android:layout_alignBottom="@+id/img_1"
        android:background="#cccccc" />

</RelativeLayout>

第二步、写一个Databean文件,用来包含所有item的内容集

import java.io.Serializable;

public class DataBean implements Serializable{

	/**
	 *
	 */
	private static final long serialVersionUID = 1L;
	int imgId;
	String title;
	String address;
	public int getImgId() {
		return imgId;
	}
	public void setImgId(int imgId) {
		this.imgId = imgId;
	}
	public String getTitle() {
		return title;
	}
	public void setTitle(String title) {
		this.title = title;
	}
	public String getAddress() {
		return address;
	}
	public void setAddress(String address) {
		this.address = address;
	}

}

第三步、写一个adapter继承自baseAdapter

package com.mylistview.listviewdm;

import java.util.ArrayList;

import com.mylistview.bean.DataBean;

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

public class ListViewAdapter extends BaseAdapter {

	Context mContext;
	ArrayList<DataBean> mData;

	public ListViewAdapter(Context mContext, ArrayList<DataBean> mData) {
		super();
		this.mContext = mContext;
		this.mData = mData;
	}

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

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

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

	@Override
	public View getView(int position, View convertView, ViewGroup parent) {
		ViewHolder holder = null;
		if (convertView == null) {
			holder = new ViewHolder();
			convertView = View.inflate(mContext, R.layout.item, null);
			holder.img_1 = (ImageView) convertView.findViewById(R.id.img_1);
			holder.title_1 = (TextView) convertView.findViewById(R.id.title_1);
			holder.address = (TextView) convertView.findViewById(R.id.address);
			convertView.setTag(holder);
		} else {
			holder = (ViewHolder) convertView.getTag();
		}
		holder.img_1.setBackgroundResource(mData.get(position).getImgId());
		holder.title_1.setText(mData.get(position).getTitle());
		holder.address.setText(mData.get(position).getAddress());
		return convertView;
	}

	class ViewHolder {
		ImageView img_1;
		TextView title_1;
		TextView address;
	}

}

第五步、拟数据到主方法,设置listveiw适配器

package com.mylistview.listviewdm;

import java.util.ArrayList;

import com.mylistview.bean.DataBean;

import android.app.Activity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.ListView;

public class MainActivity extends Activity {

	private ArrayList<DataBean> mData;
	private ListView list_v;
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.lin);
        initView();
        initData();
    }
	private void initView() {
		// TODO Auto-generated method stub
		list_v = (ListView)findViewById(R.id.lst_v);

	}
	private void initData() {
		// TODO Auto-generated method stub
		mData = new ArrayList<DataBean>();
		setData();
		list_v.setAdapter(new ListViewAdapter(this, mData));
	}
	private void setData() {
		// TODO Auto-generated method stub
		for (int i = 0; i < 4; i++) {
			DataBean mBean2 = new DataBean();
			mBean2.setImgId(R.drawable.img_1);
			mBean2.setTitle("豫蜀房河南烩面");
			mBean2.setAddress("快餐 五棵松");
			mData.add(mBean2);

			DataBean mBean = new DataBean();
			mBean.setImgId(R.drawable.img_5);
			mBean.setTitle("三样菜(阜成路店)");
			mBean.setAddress("川菜 四季青");
			mData.add(mBean);

			DataBean mBean3 = new DataBean();
			mBean3.setImgId(R.drawable.img_6);
			mBean3.setTitle("郁陵岛炭火烤肉");
			mBean3.setAddress("韩国菜 航天桥");
			mData.add(mBean3);
		}
	}
}


最后贴一张实现的效果图

时间: 2024-11-03 01:21:38

ListView自定义的相关文章

WPF自定义控件与样式(7)-列表控件DataGrid与ListView自定义样式

一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要内容: DataGrid自定义样式: ListView自定义样式: 二.DataGrid自定义样式 DataGrid是常用的数据列表显示控件,先看看实现的效果(动态图,有点大): DataGrid控件样式结构包括以下几个部分: 列头header样式 调整列头宽度的列分割线样式 行样式 行头调整高度样式 行头部样式

ListView 自定义BaseAdapter实现单选打勾(无漏洞)

最近因为一个项目的原因需要自定义一个BaseAdapter实现ListVIew单选打勾的功能,虽然听起来很简单,我在网上也 看过一些例子,似乎是实现了,但往往存在一些漏洞.往往漏洞如下 1.网上例子item较少,item增多时漏洞出现,忽略了BaseAdapter中getView()方法中convertView重用的问题 2.忽略了BaseAdapter中getView()方法并不是一下子加载完所有item,上下拖动listview时item会重新加载,getview会重新被调用,所以上下拖动的

[Android] Android RecycleView和ListView 自定义Adapter封装类

在网上查看了很多对应 Android RecycleView和ListView 自定义Adapter封装类 的文章,主要存在几个问题: 一).网上代码一大抄,复制来复制去,大部分都运行不起来,或者 格式错乱 二).剩下的那些能运行起来的,将Adapter类.ViewHolder类,放在不同文件里,导致文件多.杂 于是总结这两个单独的Custom***ViewAdapter 类,以方便调用! 一.RecycleView Adapter自定义封装类 CustomRecyclerViewAdapter

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

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

Android ListView 自定义 Adapter

自定义Adapter类 public class ListViewAdapter extends BaseAdapter { private static final String TAG = MainActivity.class.getName(); private Context context; // 运行上下文 private List<Map<String, Object>> listItems; // 商品信息集合 private LayoutInflater list

android ListView 自定义 BaseAdapter

先上效果图 由上面的效果图可以看出:页面中的LISTVIEW的每一项,都是由两个TEXTVIEW组成,初始化的时候,只显示第一个TEXTVIEW,在这里我们成为标题,而内容部分的setVisible属性为"GONE".为Ite添加onClick监听器,在每次点击的时候,显示内容部分,这里需要调用BaseAdapter的notifyDataSetChanged()进行刷新显示. 代码部分: 1 class MyLayout extends LinearLayout { 2 3 priva

ListView自定义按钮实例-标记删除功能

.aspx代码如下: <%@ Page Language="C#" AutoEventWireup="true" CodeFile="test.aspx.cs" Inherits="test" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1

ListView自定义滑动条

1 /** 2 * 修改默认滑动条 3 */ 4 private void SetSliderIcon() { 5 try { 6 Field f = AbsListView.class.getDeclaredField("mFastScroller"); 7 f.setAccessible(true); 8 Object o = f.get(ListView1); 9 f = f.getType().getDeclaredField("mThumbDrawable"

ListView自定义适配器--10.17

1. 添加button 2. ViewHolder 优化性能 就是一个持有者的类,他里面一般没有方法,只有属性,作用就是一个临时的储存器,把你getView方法中每次返回的View存起来,可以下次再用.这样做的好处就是不必每次都到布局文件中去拿到你的View,提高了效率. 3. 加入EditView