分类界面


整个项目的逻辑就是这样的

CategoryInfo 
  1. public class CategoryInfo {
  2. private String title;
  3. private String url1;
  4. private String url2;
  5. private String url3;
  6. private String name1;
  7. private String name2;
  8. private String name3;
  9. private boolean isTitle;// 是否是标题,指的是游戏,应用这些标题,下面的字段也是也是叫title,所以也这样写
  10. public boolean isTitle() {
  11. return isTitle;
  12. }
  13. public void setIsTitle(boolean isTitle) {
  14. this.isTitle = isTitle;
  15. }

CategoryProtocol
  1. public class CategoryProtocol extends BaseProtocol<List<CategoryInfo>> {
  2. @Override
  3. public List<CategoryInfo> paserJson(String json) {
  4. List<CategoryInfo> categoryInfos=new ArrayList<CategoryInfo>();
  5. try {
  6. JSONArray array=new JSONArray(json);
  7. for(int i=0;i<array.length();i++){
  8. JSONObject jsonObject = array.getJSONObject(i);
  9. String title=jsonObject.getString("title");
  10. CategoryInfo categoryInfo=new CategoryInfo();
  11. categoryInfo.setTitle(title);
  12. categoryInfo.setIsTitle(true);
  13. categoryInfos.add(categoryInfo);
  14. JSONArray jsonArray = jsonObject.getJSONArray("infos");
  15. for(int j=0;j<jsonArray.length();j++){
  16. JSONObject jsonObject2 = jsonArray.getJSONObject(j);
  17. String url1=jsonObject2.getString("url1");
  18. String url2=jsonObject2.getString("url2");
  19. String url3=jsonObject2.getString("url3");
  20. String name1=jsonObject2.getString("name1");
  21. String name2=jsonObject2.getString("name2");
  22. String name3=jsonObject2.getString("name3");
  23. CategoryInfo categoryInfo2=new CategoryInfo(title, url1, url2, url3, name1, name2, name3,false);
  24. categoryInfos.add(categoryInfo2);
  25. }
  26. }
  27. return categoryInfos;
  28. } catch (JSONException e) {
  29. e.printStackTrace();
  30. return null;
  31. }
  32. }
  33. @Override
  34. public String getKey() {
  35. return "category";
  36. }
  37. }
布局(三个这)
  1. <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
  2. android:layout_width="match_parent"
  3. android:layout_height="match_parent"
  4. android:clickable="false"
  5. android:orientation="horizontal"
  6. android:paddingLeft="5dp"
  7. android:paddingRight="5dp" >
  8. <RelativeLayout
  9. android:id="@+id/rl_1"
  10. android:layout_width="0dip"
  11. android:layout_height="wrap_content"
  12. android:layout_weight="1"
  13. android:background="@drawable/grid_item_bg"
  14. android:clickable="true"
  15. android:paddingBottom="10dp"
  16. android:paddingTop="10dp" >
  17. <ImageView
  18. android:id="@+id/iv_1"
  19. android:layout_width="55dp"
  20. android:layout_height="55dp"
  21. android:layout_centerHorizontal="true"
  22. android:scaleType="fitXY"
  23. android:src="@drawable/ic_default" />
  24. <TextView
  25. android:id="@+id/tv_1"
  26. android:layout_width="wrap_content"
  27. android:layout_height="wrap_content"
  28. android:layout_below="@id/iv_1"
  29. android:layout_centerHorizontal="true"
  30. android:textColor="#ff7a7a7a" />
  31. </RelativeLayout>
CategoryContentHolder 
  1. public class CategoryContentHolder extends BaseHolder<CategoryInfo> {
  2. ImageView [] ivs;
  3. TextView [] tvs;
  4. @Override
  5. public View initView() {
  6. View view=UiUtils.inflate(R.layout.item_category_content);
  7. ivs=new ImageView[3];
  8. ivs[0]=(ImageView) view.findViewById(R.id.iv_1);
  9. ivs[1]=(ImageView) view.findViewById(R.id.iv_2);
  10. ivs[2]=(ImageView) view.findViewById(R.id.iv_3);
  11. tvs=new TextView[3];
  12. tvs[0]=(TextView) view.findViewById(R.id.tv_1);
  13. tvs[1]=(TextView) view.findViewById(R.id.tv_2);
  14. tvs[2]=(TextView) view.findViewById(R.id.tv_3);
  15. return view;
  16. }
  17. @Override
  18. public void refreshView(CategoryInfo data) {
  19. // 第一块
  20. if(!TextUtils.isEmpty(data.getName1())&&!TextUtils.isEmpty(data.getUrl1())){
  21. tvs[0].setText(data.getName1());
  22. bitmapUtils.display(ivs[0], HttpHelper.URL+"image?name="+data.getUrl1());
  23. tvs[0].setVisibility(View.VISIBLE);
  24. ivs[0].setVisibility(View.VISIBLE);
  25. }else{
  26. tvs[0].setVisibility(View.INVISIBLE);
  27. ivs[0].setVisibility(View.INVISIBLE);
  28. }
  29. // 第二块
  30. if(!TextUtils.isEmpty(data.getName2())&&!TextUtils.isEmpty(data.getUrl2())){
  31. tvs[1].setText(data.getName2());
  32. bitmapUtils.display(ivs[1], HttpHelper.URL+"image?name="+data.getUrl2());
  33. tvs[1].setVisibility(View.VISIBLE);
  34. ivs[1].setVisibility(View.VISIBLE);
  35. }else{
  36. tvs[1].setVisibility(View.INVISIBLE);
  37. ivs[1].setVisibility(View.INVISIBLE);
  38. }
  39. //第三块
  40. if(!TextUtils.isEmpty(data.getName3())&&!TextUtils.isEmpty(data.getUrl3())){
  41. tvs[2].setText(data.getName3());
  42. bitmapUtils.display(ivs[2], HttpHelper.URL+"image?name="+data.getUrl3());
  43. tvs[2].setVisibility(View.VISIBLE);
  44. ivs[2].setVisibility(View.VISIBLE);
  45. }else{
  46. tvs[2].setVisibility(View.INVISIBLE);
  47. ivs[2].setVisibility(View.INVISIBLE);
  48. }
  49. }
  50. }
CategoryTitleHolder 
  1. public class CategoryTitleHolder extends BaseHolder<CategoryInfo> {
  2. private TextView tv;
  3. @Override
  4. public View initView() {
  5. tv = new TextView(UiUtils.getContext());
  6. tv.setTextColor(Color.BLACK);
  7. tv.setBackgroundDrawable(UiUtils.getDrawalbe(R.drawable.grid_item_bg));
  8. return tv;
  9. }
  10. @Override
  11. public void refreshView(CategoryInfo data) {
  12. tv.setText(data.getTitle());
  13. }
  14. }
CategoryFragment ( 注意CategoryAdapter)
  1. public class CategoryFragment extends BaseFragment {
  2. private List<CategoryInfo> datas;
  3. public static int ITEM_TITLE =2;
  4. // 创建成功的界面
  5. @Override
  6. public View createSuccessView() {
  7. BaseListView listView = new BaseListView(UiUtils.getContext());
  8. listView.setAdapter(new CategoryAdapter(datas, listView));
  9. return listView;
  10. }
  11. private class CategoryAdapter extends DefaultAdapter<CategoryInfo> {
  12. private int position;// 当前条目位置记录
  13. public CategoryAdapter(List<CategoryInfo> datas, ListView lv) {
  14. super(datas, lv);
  15. }
  16. // 实现每个条目的界面
  17. @Override
  18. protected BaseHolder<CategoryInfo> getHolder() {
  19. if (!datas.get(position).isTitle()) {
  20. return new CategoryContentHolder();
  21. }else{
  22. return new CategoryTitleHolder();
  23. }
  24. }
  25. @Override
  26. public View getView(int position, View convertView, ViewGroup parent) {
  27. this.position = position;
  28. return super.getView(position, convertView, parent);
  29. }
  30. @Override
  31. protected boolean hasMore() { // 当前方法 如果为false onload就不会被调用了
  32. return false;
  33. }
  34. @Override
  35. protected int getInnerItemViewType(int position) {
  36. if (datas.get(position).isTitle()) {
  37. return ITEM_TITLE;
  38. } else {
  39. return super.getInnerItemViewType(position);
  40. }
  41. }
  42. @Override
  43. protected List<CategoryInfo> onload() {
  44. return null;
  45. }
  46. // 集合 管理三个convertView
  47. @Override
  48. public int getViewTypeCount() {
  49. return super.getViewTypeCount() + 1; // 又额外多了一种条目类型 现在又三种 1 标题 2 内容 3 加载更多(没有显示)
  50. }
  51. }
  52. // 请求服务器
  53. @Override
  54. protected LoadResult load() {
  55. CategoryProtocol protocol = new CategoryProtocol();
  56. datas = protocol.load(0);
  57. return checkData(datas);
  58. }
  59. }
修改DefaultAdapter
  1. public View getView(int position, View convertView, ViewGroup parent) {
  2. BaseHolder holder = null;
  3. switch (getItemViewType(position)) { // 判断当前条目时什么类型
  4. case MORE_ITEM:
  5. if(convertView==null){
  6. holder=getMoreHolder();
  7. }else{
  8. holder=(BaseHolder) convertView.getTag();
  9. }
  10. break;
  11. default:
  12. if (convertView == null) {
  13. holder = getHolder();
  14. } else {
  15. System.out.println("aaa");
  16. holder = (BaseHolder) convertView.getTag();
  17. }
  18. if (position < datas.size()) {
  19. holder.setData(datas.get(position));
  20. }
  21. break;
  22. }
  23. return holder.getContentView(); // 如果当前Holder 恰好是MoreHolder 证明MoreHOlder已经显示
  24. }
  25. private MoreHolder holder;
  26. private BaseHolder getMoreHolder() {
  27. if(holder!=null){
  28. return holder;
  29. }else{
  30. holder=new MoreHolder(this,hasMore());
  31. return holder;
  32. }
  33. }
  34. /**
  35. * 是否有额外的数据
  36. * @return
  37. */
  38. protected boolean hasMore() {
  39. return true;
  40. }

 
 
 
 
 

14.不同条目的listview的更多相关文章

  1. 【Android基础】listview控件的使用(3)------Map与SimpleAdapter组成的多显示条目的Listview

    前面介绍的两种listview的使用都是最基础的,所以有很大的局限性,比如只能在一个item(即每一行的条目)中显示一个文本信息,这一篇我将介绍Map与SimpleAdapter组成的多显示条目的Li ...

  2. 026 Android 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+读取内存空间、手机进程信息+常驻悬浮框

    1.目标效果 带不同类型条目的listview(纯文本类型的条目,图片+文字类型的条目)+常驻悬浮框 2.页面布局文件 (1)activity_process_manager.xml <?xml ...

  3. [Delphi]带进度条的ListView

    带进度条的ListView unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, C ...

  4. 更改AD查询LDAP条目的1000限制

    解除LDAP导入时的AD条目查询限制 解除LDAP导入或读取AD用户数限制问题 更改AD查询LDAP条目的1000限制 来源:http://www.jiancool.com/article/55373 ...

  5. 线程安全地获取插入mysql的条目的id

    在往mysql中插入条目时有时会希望能得到该插入条目的id,一种方式是再执行一个select语句条件为max(id)来获取,但这种形式在并发环境里并不是线程安全的,因为在你完成插入到再执行一个sele ...

  6. android 14 进度条和拖动条

    进度条: <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:l ...

  7. android-----带你一步一步优化ListView(一)

    ListView作为android中最常使用的控件,可以以条目的形式显示大量的数据,经常被用于显示最近联系人列表,对于每一个 Item,均要求adapter的getView方法返回一个View,因此L ...

  8. 10. 面向holder编程、自动轮询

    没有看过上一篇文章的话,建议先去阅读GooglePlay:9.代码抽取(adapter) 项目框架的搭建: 以后每个view都是holder BaseHolder public abstract cl ...

  9. Android学习笔记_11_ListView控件使用

    一.界面设计: 1.activity_main.xml文件: <RelativeLayout xmlns:android="http://schemas.android.com/apk ...

随机推荐

  1. Centos7下面配置客户端OpenVPN

    安装 openvpn yum install -y openvpn vim 配置默认的 daemon 文件 vim /usr/lib/systemd/system/openvpn@.service [ ...

  2. 在Linux 安装Python3.5.6详细文档!!!!

    在Linux 安装Python3.5.6详细文档!!!! 1.安装相关依赖库(工具包) yum install gcc patch libffi-devel python-devel  zlib-de ...

  3. linux一台服务器配置多个Tomcat

    前提:linux服务器上已经运行多个Tomcat,再去搭建一个Tomcat服务 1.官网下载Tomcat 2.上传到服务器指定一个目录/usr/local/tomcat 3.然后解压tar包,tar ...

  4. 除非你是BAT,前端开发中最好少造轮子

    站在前人的肩膀上 HTML.CSS.JavaScript是前端的根基,这是无可否认的事实.正如一辆车当然都是由一堆钢板和螺钉组成的,但是现在还有人拎着个锤子敲敲打打的造车吗?李书福说过,“汽车不过是四 ...

  5. mactype配置

    配合 Firefox 小小设置(改了好多配置,似乎主要是修改了渲染的核心?是叫这个么?把那个Siera?删掉了,就好了)后,效果极佳,我在原有配置的基础上,加大了字重,显示更粗,更明显. 这里是原配置 ...

  6. 初识spark的MLP模型

    初识Spark的MLP模型 1. MLP介绍 Multi-layer Perceptron(MLP),即多层感知器,是一个前馈式的.具有监督的人工神经网络结构.通过多层感知器可包含多个隐藏层,实现对非 ...

  7. PHP去掉html中的空行、空白函数

    function DeleteHtml($str){ $str = trim($str); $str = ereg_replace("\t","",$str); ...

  8. VB 读取列表文件名

    Private Sub Command1_Click()Dim d As String, s As String If Dir(App.Path & "\down", vb ...

  9. 行盒(line box)垂直方向的属性详解:从font-size、line-height到vertical-align

    视觉格式化模型 在一个文档中,每个元素都被表示为0.1或多个矩形的盒子.确定这些盒子的尺寸, 属性 --- 像它的颜色,背景,边框方面 --- 和位置是渲染引擎的目标.① 在CSS中,使用标准盒模型描 ...

  10. fiddler不能抓某些的包的原因

    用fiddler抓某app的包时,死活抓不到,确定自己设置的没有错,并且让小A同事也看了一遍我的设置,确认没错后,又在小A同事那儿试了下还是抓不到 后来在网上找了很多资料,才发现是因为一些app使用了 ...