14.不同条目的listview
分类界面


public class CategoryInfo {
private String title;
private String url1;
private String url2;
private String url3;
private String name1;
private String name2;
private String name3;
private boolean isTitle;// 是否是标题,指的是游戏,应用这些标题,下面的字段也是也是叫title,所以也这样写
public boolean isTitle() {
return isTitle;
}
public void setIsTitle(boolean isTitle) {
this.isTitle = isTitle;
}
public class CategoryProtocol extends BaseProtocol<List<CategoryInfo>> {
@Override
public List<CategoryInfo> paserJson(String json) {
List<CategoryInfo> categoryInfos=new ArrayList<CategoryInfo>();
try {
JSONArray array=new JSONArray(json);
for(int i=0;i<array.length();i++){
JSONObject jsonObject = array.getJSONObject(i);
String title=jsonObject.getString("title");
CategoryInfo categoryInfo=new CategoryInfo();
categoryInfo.setTitle(title);
categoryInfo.setIsTitle(true);
categoryInfos.add(categoryInfo);
JSONArray jsonArray = jsonObject.getJSONArray("infos");
for(int j=0;j<jsonArray.length();j++){
JSONObject jsonObject2 = jsonArray.getJSONObject(j);
String url1=jsonObject2.getString("url1");
String url2=jsonObject2.getString("url2");
String url3=jsonObject2.getString("url3");
String name1=jsonObject2.getString("name1");
String name2=jsonObject2.getString("name2");
String name3=jsonObject2.getString("name3");
CategoryInfo categoryInfo2=new CategoryInfo(title, url1, url2, url3, name1, name2, name3,false);
categoryInfos.add(categoryInfo2);
}
}
return categoryInfos;
} catch (JSONException e) {
e.printStackTrace();
return null;
}
}
@Override
public String getKey() {
return "category";
}
}
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:clickable="false"
android:orientation="horizontal"
android:paddingLeft="5dp"
android:paddingRight="5dp" >
<RelativeLayout
android:id="@+id/rl_1"
android:layout_width="0dip"
android:layout_height="wrap_content"
android:layout_weight="1"
android:background="@drawable/grid_item_bg"
android:clickable="true"
android:paddingBottom="10dp"
android:paddingTop="10dp" >
<ImageView
android:id="@+id/iv_1"
android:layout_width="55dp"
android:layout_height="55dp"
android:layout_centerHorizontal="true"
android:scaleType="fitXY"
android:src="@drawable/ic_default" />
<TextView
android:id="@+id/tv_1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_below="@id/iv_1"
android:layout_centerHorizontal="true"
android:textColor="#ff7a7a7a" />
</RelativeLayout>
public class CategoryContentHolder extends BaseHolder<CategoryInfo> {
ImageView [] ivs;
TextView [] tvs;
@Override
public View initView() {
View view=UiUtils.inflate(R.layout.item_category_content);
ivs=new ImageView[3];
ivs[0]=(ImageView) view.findViewById(R.id.iv_1);
ivs[1]=(ImageView) view.findViewById(R.id.iv_2);
ivs[2]=(ImageView) view.findViewById(R.id.iv_3);
tvs=new TextView[3];
tvs[0]=(TextView) view.findViewById(R.id.tv_1);
tvs[1]=(TextView) view.findViewById(R.id.tv_2);
tvs[2]=(TextView) view.findViewById(R.id.tv_3);
return view;
}
@Override
public void refreshView(CategoryInfo data) {
// 第一块
if(!TextUtils.isEmpty(data.getName1())&&!TextUtils.isEmpty(data.getUrl1())){
tvs[0].setText(data.getName1());
bitmapUtils.display(ivs[0], HttpHelper.URL+"image?name="+data.getUrl1());
tvs[0].setVisibility(View.VISIBLE);
ivs[0].setVisibility(View.VISIBLE);
}else{
tvs[0].setVisibility(View.INVISIBLE);
ivs[0].setVisibility(View.INVISIBLE);
}
// 第二块
if(!TextUtils.isEmpty(data.getName2())&&!TextUtils.isEmpty(data.getUrl2())){
tvs[1].setText(data.getName2());
bitmapUtils.display(ivs[1], HttpHelper.URL+"image?name="+data.getUrl2());
tvs[1].setVisibility(View.VISIBLE);
ivs[1].setVisibility(View.VISIBLE);
}else{
tvs[1].setVisibility(View.INVISIBLE);
ivs[1].setVisibility(View.INVISIBLE);
}
//第三块
if(!TextUtils.isEmpty(data.getName3())&&!TextUtils.isEmpty(data.getUrl3())){
tvs[2].setText(data.getName3());
bitmapUtils.display(ivs[2], HttpHelper.URL+"image?name="+data.getUrl3());
tvs[2].setVisibility(View.VISIBLE);
ivs[2].setVisibility(View.VISIBLE);
}else{
tvs[2].setVisibility(View.INVISIBLE);
ivs[2].setVisibility(View.INVISIBLE);
}
}
}
public class CategoryTitleHolder extends BaseHolder<CategoryInfo> {
private TextView tv;
@Override
public View initView() {
tv = new TextView(UiUtils.getContext());
tv.setTextColor(Color.BLACK);
tv.setBackgroundDrawable(UiUtils.getDrawalbe(R.drawable.grid_item_bg));
return tv;
}
@Override
public void refreshView(CategoryInfo data) {
tv.setText(data.getTitle());
}
}
public class CategoryFragment extends BaseFragment {
private List<CategoryInfo> datas;
public static int ITEM_TITLE =2;
// 创建成功的界面
@Override
public View createSuccessView() {
BaseListView listView = new BaseListView(UiUtils.getContext());
listView.setAdapter(new CategoryAdapter(datas, listView));
return listView;
}
private class CategoryAdapter extends DefaultAdapter<CategoryInfo> {
private int position;// 当前条目位置记录
public CategoryAdapter(List<CategoryInfo> datas, ListView lv) {
super(datas, lv);
}
// 实现每个条目的界面
@Override
protected BaseHolder<CategoryInfo> getHolder() {
if (!datas.get(position).isTitle()) {
return new CategoryContentHolder();
}else{
return new CategoryTitleHolder();
}
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
this.position = position;
return super.getView(position, convertView, parent);
}
@Override
protected boolean hasMore() { // 当前方法 如果为false onload就不会被调用了
return false;
}
@Override
protected int getInnerItemViewType(int position) {
if (datas.get(position).isTitle()) {
return ITEM_TITLE;
} else {
return super.getInnerItemViewType(position);
}
}
@Override
protected List<CategoryInfo> onload() {
return null;
}
// 集合 管理三个convertView
@Override
public int getViewTypeCount() {
return super.getViewTypeCount() + 1; // 又额外多了一种条目类型 现在又三种 1 标题 2 内容 3 加载更多(没有显示)
}
}
// 请求服务器
@Override
protected LoadResult load() {
CategoryProtocol protocol = new CategoryProtocol();
datas = protocol.load(0);
return checkData(datas);
}
}
public View getView(int position, View convertView, ViewGroup parent) {
BaseHolder holder = null;
switch (getItemViewType(position)) { // 判断当前条目时什么类型
case MORE_ITEM:
if(convertView==null){
holder=getMoreHolder();
}else{
holder=(BaseHolder) convertView.getTag();
}
break;
default:
if (convertView == null) {
holder = getHolder();
} else {
System.out.println("aaa");
holder = (BaseHolder) convertView.getTag();
}
if (position < datas.size()) {
holder.setData(datas.get(position));
}
break;
}
return holder.getContentView(); // 如果当前Holder 恰好是MoreHolder 证明MoreHOlder已经显示
}
private MoreHolder holder;
private BaseHolder getMoreHolder() {
if(holder!=null){
return holder;
}else{
holder=new MoreHolder(this,hasMore());
return holder;
}
}
/**
* 是否有额外的数据
* @return
*/
protected boolean hasMore() {
return true;
}
14.不同条目的listview的更多相关文章
- 【Android基础】listview控件的使用(3)------Map与SimpleAdapter组成的多显示条目的Listview
前面介绍的两种listview的使用都是最基础的,所以有很大的局限性,比如只能在一个item(即每一行的条目)中显示一个文本信息,这一篇我将介绍Map与SimpleAdapter组成的多显示条目的Li ...
- 026 Android 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+读取内存空间、手机进程信息+常驻悬浮框
1.目标效果 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+常驻悬浮框 2.页面布局文件 (1)activity_process_manager.xml <?xml ...
- [Delphi]带进度条的ListView
带进度条的ListView unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, C ...
- 更改AD查询LDAP条目的1000限制
解除LDAP导入时的AD条目查询限制 解除LDAP导入或读取AD用户数限制问题 更改AD查询LDAP条目的1000限制 来源:http://www.jiancool.com/article/55373 ...
- 线程安全地获取插入mysql的条目的id
在往mysql中插入条目时有时会希望能得到该插入条目的id,一种方式是再执行一个select语句条件为max(id)来获取,但这种形式在并发环境里并不是线程安全的,因为在你完成插入到再执行一个sele ...
- android 14 进度条和拖动条
进度条: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l ...
- android-----带你一步一步优化ListView(一)
ListView作为android中最常使用的控件,可以以条目的形式显示大量的数据,经常被用于显示最近联系人列表,对于每一个 Item,均要求adapter的getView方法返回一个View,因此L ...
- 10. 面向holder编程、自动轮询
没有看过上一篇文章的话,建议先去阅读GooglePlay:9.代码抽取(adapter) 项目框架的搭建: 以后每个view都是holder BaseHolder public abstract cl ...
- Android学习笔记_11_ListView控件使用
一.界面设计: 1.activity_main.xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...
随机推荐
- Unity 角色移动贴墙行走
直接贴上代码,旋转角色角度检测碰撞 Vector2 v2Normal = new Vector2(normal.x, normal.y); float fAngle = Vector2.SignedA ...
- Pytorch之训练器设置
Pytorch之训练器设置 引言 深度学习训练的时候有很多技巧, 但是实际用起来效果如何, 还是得亲自尝试. 这里记录了一些个人尝试不同技巧的代码. tensorboardX 说起tensorflow ...
- UI行业发展预测 & 系列规划的调整
又双叒叕拖更了,上一篇还是1月22号更新的,这都3月9号了…… 前面几期把职业规划.能力分析.几个分析用的设计理论都写完了,当然实际工作中用到的方法论不止上面这些,后续会接着学习: 如果你的目标是一线 ...
- [翻译]理解分析Linux里的101个ELF文件
原文:https://linux-audit.com/elf-binaries-on-linux-understanding-and-analysis/
- ZOJ 2507 Let's play a game
题目链接:http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1507 MisereNim博弈.代码如下: //=========== ...
- Golang之路【目录】
我正在写一套使用Golang全栈开发的教程,名字暂叫“Golang之路”,希望大家多提建议. 目录如下: Golang之路[第一篇]:Golang简介和入门Golang之路[第二篇]:Golang基础 ...
- ActivityThread 源码分析
ActivityThread是Android Framework中一个非常重要的类,它代表一个应用进程的主线程(对于应用进程来说,ActivityThread的main函数确实是由该进程的主线程执行) ...
- spring boot 注解
一级注解:(写在类名前面的)@RestController: 等价于在函数前面写@ResponseBody ,会直接返回要显示的内容 @ControllerString返回的是模板文件的名称. 二级注 ...
- appium python入门例子
在这里我选的编辑器是pycharm,在这里以微信为例,写了一小demo,具体的代码如下 from appium import webdriverimport timedesired_caps={ 'p ...
- H5新特性---SVG--椭圆--直线--文本--滤镜(高斯滤镜--模糊)--地理定位
今天的目标 3.1:h5新特性--SVG--椭圆 <ellipse rx="" ry="" cx="" cy="" ...