由于 scrollview 套 listview 会有很多问题,网上很多人用 LinearLayout 模拟 listview, 也可以设置 adapter。

很多人直接继承 BaseAdapter, 可能是偷懒吧, 其实没有必要, BaseAdapter 里面有很多其它无用的方法被继承,

其次 getView 等方法的签名可能不太符合, 直接定义一个接口或抽象类更好。

这种方式在界面中有很多动态 list 布局时,抽离出来可能会灵活一些。 不用在代码中每次都 for 循环,动态创建 view 再添加。

如果这种动态布局不是很多的话,直接 for 循环就行, 简单点的直接扩展一下 LinearLayout 也行。

当到处都是 list 动态布局时而 ListView 又不好用, 这种模拟 ListView setAdapter 的方式会灵活一些,代码复用性好一些。

1 可以简单的定义一个接口供子 adapter 实现

public interface MyLinearLayoutInterface {
int getCount(); Object getItem(int position); View getView(int position);
}

2 如果子类代码比较重复的话,也可以抽出一个基类

public abstract class LinearLayoutBaseAdapter {
private List<? extends Object> list;
private Context context; public LinearLayoutBaseAdapter(Context context, List<? extends Object> list) {
this.context = context;
this.list = list;
} public LayoutInflater getLayoutInflater() {
if (context != null) {
return LayoutInflater.from(context);
} return null;
} public int getCount() {
if (list != null) {
return list.size();
} return 0;
}; public Object getItem(int position) {
if (list != null) {
return list.get(position);
} return null;
}; /**
* 供子类复写
*
* @param position
* @return
*/
abstract View getView(int position);
}

3 主类将 adapter 里面的 view 全部加入 LinearLayout 并设置回调监听

public class MyLinearLayoutForListView extends LinearLayout {
private LinearLayoutBaseAdapter adapter;
private OnItemClickListener onItemClickListener; public MyLinearLayoutForListView(Context context) {
super(context);
} public MyLinearLayoutForListView(Context context, AttributeSet attrs) {
super(context, attrs);
} public void setAdapter(LinearLayoutBaseAdapter adapter) {
this.adapter = adapter;
// setAdapter 时添加 view
bindView();
} public void setOnItemClickListener(OnItemClickListener onItemClickListener) {
this.onItemClickListener = onItemClickListener; } /**
* 绑定 adapter 中所有的 view
*/
private void bindView() {
if (adapter == null) {
return;
} for (int i = 0; i < adapter.getCount(); i++) {
final View v = adapter.getView(i);
final int tmp = i;
final Object obj = adapter.getItem(i); // view 点击事件触发时回调我们自己的接口
v.setOnClickListener(new View.OnClickListener() { @Override
public void onClick(View v) {
if (onItemClickListener != null) {
onItemClickListener.onItemClicked(v, obj, tmp);
}
}
}); addView(v);
}
} /**
*
* 回调接口
*/
public interface OnItemClickListener {
/**
*
* @param v
* 点击的 view
* @param obj
* 点击的 view 所绑定的对象
* @param position
* 点击位置的 index
*/
public void onItemClicked(View v, Object obj, int position);
}
}

4 前台代码

List<Info> list = new ArrayList<Info>();
MyLinearLayoutForListView layout = (MyLinearLayoutForListView) findViewById(R.id.mylayout); MyAdapter adapter = new MyAdapter(this, list);
layout.setAdapter(adapter); layout.setOnItemClickListener(new MyLinearLayoutForListView.OnItemClickListener() { @Override
public void onItemClicked(View v, Object obj, int position) {
Info info = (Info) obj;
if (info != null) {
// do something
}
}
});

  

android LinearLayoutForListView的更多相关文章

  1. Android之ScrollView

    1.ScrollView和HorizontalScrollView是为控件或者布局添加滚动条 2.上述两个控件只能有一个孩子,但是它并不是传统意义上的容器 3.上述两个控件可以互相嵌套 4.滚动条的位 ...

  2. 解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一

    转载请注明出处: http://www.goteny.com/articles/2013/11/8.html http://www.cnblogs.com/zjjne/p/3428480.html 当 ...

  3. android scrollview listview显示不全

    原来处理方法是重写ListView import android.content.Context; import android.util.AttributeSet; import android.v ...

  4. [转载]Android: 如何实现ScrollView中含有ListView?

    原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf ListView本身就含有ScrollView,因此把ListView放到ScrollView ...

  5. 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新

    本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...

  6. 配置android sdk 环境

    1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/

  7. Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记

    以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...

  8. Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记

    以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...

  9. Android请求网络共通类——Hi_博客 Android App 开发笔记

    今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...

随机推荐

  1. 一、Numpy基础--数组

    (一)Numpy数组对象 Numpy中的nadrray是一个多维数组对象,该对象由两部分组成: 实际的数据 描述这些数据的元数据 大部分的数组操作仅仅修改元数据部分,而不改变底层的实际数据. 数组的数 ...

  2. 关于super关键字与继承

    super它只是一个限定词,当用super引用时,它也是引用当前对象本身,只是super只是限定了访问当前对象从父类那里继承得到成员变量或方法. import java.util.Date; publ ...

  3. 新入门PGSQL数据库(尝试利用PGPOOL实现分布式),摘录笔记

    概念: PostgreSQL (pronounced "post-gress-Q-L") is an open source relational database managem ...

  4. PMBOK项目管理思维导图梳理

    采用思维导图的形式来展示项目管理的五大过程组.九大知识领域,能更好的展示框架结构,便于理解.分析. 下图为思维导图化制的项目管理要素:灰色为启动过程组.白色为规划过程组.紫色为执行过程组.蓝色为监控过 ...

  5. 查看linux ssh服务信息及运行状态

    关于ssh服务端配置有不少文章,例如 linux下ssh服务配置,这里仅列举出一些查看ssh服务相关信息的常用命令. rpm -qa | grep ssh 可以看到系统中ssh安装包 rpm -ql ...

  6. ajax 多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题

     多个setInterval进行ajax请求的页面长时间打开会出现页面卡死问题 浏览器的渲染(UI)线程和js线程是互斥的,在执行js耗时操作时,页面渲染会被阻塞掉.当我们执行异步ajax的时候没有问 ...

  7. 《Beginning Java 7》 - 7 - abstract class 抽象类 和 interface 接口

    1. 抽象类: 为什么用抽象类: 一些 generic 的类本身并没有现实意义,所以不需要被实例化.比如动物,自然界没有动物这个物种,但却有无数的继承自动物的物种,那么动物本身可以是一个抽象类. 抽象 ...

  8. CF|codeforces 280C Game on Tree

    题目链接:戳我 大概题意:给一棵树,然后每次可以删除一个子树,问你期望多少次能把整棵树都删完? 概率和期望是个神仙..我不会 对于这个题,我们要有一个前置知识--期望的线性性,就是说总期望的值等于各个 ...

  9. [转]解读Unity中的CG编写Shader系列6——不透明度与混合

    1.不透明度当我们要将两个半透的纹理贴图到一个材质球上的时候就遇到混合的问题,由于前面的知识我们已经知道了片段着色器以及后面的环节的主要工作是输出颜色与深度到帧缓存中,所以两个纹理在每个像素上的颜色到 ...

  10. django admin后台的简单使用

    创建自己的model.py文件 from django.db import models from django.contrib.auth.models import ( BaseUserManage ...