android LinearLayoutForListView
由于 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的更多相关文章
- Android之ScrollView
1.ScrollView和HorizontalScrollView是为控件或者布局添加滚动条 2.上述两个控件只能有一个孩子,但是它并不是传统意义上的容器 3.上述两个控件可以互相嵌套 4.滚动条的位 ...
- 解决Android ListView 和 ScrollView 共存时冲突 问题 方法其一
转载请注明出处: http://www.goteny.com/articles/2013/11/8.html http://www.cnblogs.com/zjjne/p/3428480.html 当 ...
- android scrollview listview显示不全
原来处理方法是重写ListView import android.content.Context; import android.util.AttributeSet; import android.v ...
- [转载]Android: 如何实现ScrollView中含有ListView?
原文地址:Android: 如何实现ScrollView中含有ListView?作者:mailofzxf ListView本身就含有ScrollView,因此把ListView放到ScrollView ...
- 【原】Android热更新开源项目Tinker源码解析系列之三:so热更新
本系列将从以下三个方面对Tinker进行源码解析: Android热更新开源项目Tinker源码解析系列之一:Dex热更新 Android热更新开源项目Tinker源码解析系列之二:资源文件热更新 A ...
- 配置android sdk 环境
1:下载adnroid sdk安装包 官方下载地址无法打开,没有vpn,使用下面这个地址下载,地址:http://www.android-studio.org/
- Android SwipeRefreshLayout 下拉刷新——Hi_博客 Android App 开发笔记
以前写下拉刷新 感觉好费劲,要判断ListView是否滚到顶部,还要加载头布局,还要控制 头布局的状态,等等一大堆.感觉麻烦死了.今天学习了SwipeRefreshLayout 的用法,来分享一下,有 ...
- Android Studio配置 AndroidAnnotations——Hi_博客 Android App 开发笔记
以前用Eclicps 用习惯了现在 想学学 用Android Studio 两天的钻研终于 在我电脑上装了一个Android Studio 并完成了AndroidAnnotations 的配置. An ...
- Android请求网络共通类——Hi_博客 Android App 开发笔记
今天 ,来分享一下 ,一个博客App的开发过程,以前也没开发过这种类型App 的经验,求大神们轻点喷. 首先我们要创建一个Andriod 项目 因为要从网络请求数据所以我们先来一个请求网络的共通类. ...
随机推荐
- Ajax轮询消息自动提示(消息盒子)
经过一下午写了个消息盒子的例子,用的是ajax方式轮询读取,没有用到后台自动“推”数据的方式,效果良好. <%@ Page Language="C#" AutoEventWi ...
- Android--iOS抓取崩溃日志
android闪退获取日志方法: 1.下载adb工具包 2.注意事项 请确保电脑上只连接了一台手机设备(最好只连接一条USB线),同时确保手机已开启USB调试模式(可通过手机助手查看连接状态) 3.A ...
- poj2478——Farey Sequence(欧拉函数)
Farey Sequence Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 18507 Accepted: 7429 D ...
- 【模板模式】 Template Pattern
模板模式 又叫模板方法模式,在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中.模板方法使得子类可以在不改变算法结构的情冴下,重新定义算法中的某些步骤(这个我觉得很抽象,很抽象) e:学会说“不 ...
- C# 连接Oracle,并调用存储过程(存在返回值),C# 调用sql存储过程
1.获取Oracle表格信息 public OracleHelpers(string ConnStr) { ConnectionString = ConnStr; conn = new OracleC ...
- Linux常用命令,学的时候自己记的常用的保存下来方便以后使用 o(∩_∩)o 哈哈
service httpd restart 重启Apache service mysqld restart 重启mysql [-][rwx][r-x][r--] 1 234 567 890 421 4 ...
- Linux下卸载删除.Net Core
最近在技术博客和技术交流群遇到很多小伙伴们在Linux下更新或者安装.Net Core SDK后dotnet命令无法识别等问题,现如下解决: 卸载SDK命令 sudo yum remove dotne ...
- C# Winform Label内容根据其宽度自动调整字体大小
C# Winform Label内容根据其宽度自动调整字体大小 项目,有个要求,Label中显示的内容,能够根据其宽度自动调整字体的大小进行显示,刚刚开始的时候,总是想着通过不同的方法来直接测量内容的 ...
- [HAOI2008] 排名系统
题目链接:戳我 要注意因为数可能会对应很多人,但是输出的时候要按照添加的顺序输出.所以我们不能将相同值的节点合并,用set维护.就算值相同也只能新开节点. 然后就没有什么了...懒得写哈希表..直接上 ...
- tail()和head()
pandas 里的tail() 函数,读取后几行. head() dataframe.head():前五行 显示某一列的前五行,两种方法: 或者: