再探ListView数据展示

从数据库里查询数据展示到listview上的案例 编写一个从数据库里查询数据展示到listview上的案例 运行结果:点击find按钮,会将数据库中添加的数据显示在List View上 结果如下: 创建如图所示: 代码如下: PersonAdapter package cn.edu.bzu.datashow.adapter; import android.conte 阅读详情

前记: 最近刚换了新工作,从天津来到了大帝都来工作 ,双十一的时候也入手了两本新书 《神兵利器》《Android群英传》 ,因此也可以正式开始我的Android进阶之路。前半个月一直在忙于适应新公司的工作,一些遇到的零碎的知识点都记录在自己的笔记中。在今后的日子里,自己会尽量把这些知识点整理记录下来。用来提高和巩固自己的Android知识。

  今天要写的是有关于ListView的一些知识点。ListView虽说用的很多了,但是对于有些知识点,我个人而言还是处于半懂不懂不懂得阶段,虽然它已经逐渐在RecyclerView取代,但是对于公司项目而言,ListView现在还处于举足轻重的地位。所以今天就对其常规用法做一个总结:文章大体包含下面几个方面:
  
1. ListView的数据更新
2. ListView的没有条目的时候显示效果
3. ViewHolder的原理是如何优化ListView的


ListView设置没有条目时的显示效果

问题引入: 我们在使用ListView展示来自服务器或者网络的数据的时候,经常会由于网络不好或者服务器宕(dang)机,ListVIew将没有数据可以展示这是我们一般会显示一张友好的图片提示,提示用户下拉刷新,或者检查网络。

我们一般的做法是可能是使用帧布局(FrameLayout)中覆盖到ListView上,然后通过一定的条件隐藏或者显示该图片,其实像这样的功能ListView本身就有:那就是 listView.setEmptyView(View view) ,具体使用方式如下:

<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/activity_main"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ListView
        android:id="@+id/listView"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>


    <ImageView
        android:id="@+id/image_empty"
        android:src="@mipmap/ic_launcher"
        android:layout_width="match_parent"
        android:layout_height="match_parent"/>

 </RelativeLayout>

然后在代码将imageView 设置给listView

private ListView mListView;
private ImageView mImageView;

......

mListView = (ListView) findViewById(R.id.listView);
mImageView = (ImageView) findViewById(R.id.image);
mListView.setEmptyView(mImageView);

  上述代码当Listview没有数据的时候将会显示ImageView的图片,当有数据的时候ListView将会自动隐藏该ImageView。一个小小的方法我们并不常用,但是知道了以后会省去我们好多设置error图片的步骤

ListView到底该如何更新数据?

问题引入: 回想一下我们是怎么给ListView设置数据的? 大致需要这几步

  1. 定义BaseAdapter的子类,复写getView getCount getItem getItemId 这四个方法
  2. 定义一个构造方法,将需要加载数据的集合通过构造方法传递进来,并指向内部的集合
  3. 生成定义好的Adapter的对象,通过setAdapter方法设置给ListView

这样对于我们展示一个普通的不会变动的ListView当然没有问题。so 当我们是一个初学者的时候我们也认为,这是一个方程式,这样写结果就是对的。那么简单看下下面这段代码

class Adapter extends BaseAdapter {
        private LayoutInflater mInflater;
        private Context mContext;
        private ArrayList<String> mArrayList = null;

        public Adapter(Context context, ArrayList<String> arrayList) {
            mContext = context;
            mArrayList = arrayList;
            mInflater = LayoutInflater.from(mContext);
        }

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

        @Override
        public Object getItem(int position) {
            return mArrayList.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) {
                convertView = mInflater.inflate(R.layout.item, parent, false);
                holder = new ViewHolder();
                holder.mTextView = (TextView) convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.mTextView.setText(mArrayList.get(position));
            return convertView;
        }

        static class ViewHolder {
            TextView mTextView;
        }
    }

------
Activity中的代码:

    mDatas = new ArrayList<>();
    mAdapter = new Adapter(this, mDatas);
    mListView.setAdapter(mAdapter);

相信大家已经对上述代码足够熟悉了,如果我们此刻运行代码,listView将没有任何数据显示。因为我们通过构造参数传递给 Adapter 的 mDatas 是没有任何数据的。

此时我们假设我们通过网络请求从网络请求来了一条数据,然后我们要设置给ListView进行展示,我们通常的做法是:

     case R.id.btn_add:
                i++;
                mDatas.add("第" + i + "条目");//操作的是添加进去的ArrayList
                mAdapter.notifyDataSetChanged();
                break;

这里我通过一个按钮的点击事件进行模拟数据的添加。每点击一次为集合添加一条数据并通知Adapter刷新。我们发现这也没什么问题数据可以正确显示。ok,我们暂且记一下mDatas与Adapter中的mDatas是同一个集合。

java中通过构造方法传递的参数,是引用传递,而不是值传递。我们在生成Adapter的时候讲外部的mDatas = new ArrayList<>();传递给Adapter中的mArrayList如果现在还闹不清楚什么是引用传递和值传递,那么就理解成。mDatas和 mArrayList这两个引用,指向的都是内存中的new ArrayLIst<>();生成的对象。

下面我们将要模拟一下通常我们下拉刷新的操作:
1. 从网络获取一个封装了条目展示内容对象的信息字符串
2. 通过Json解析成对应的Entity对象,封装成集合
3. 将这个集合设置给之前的mDatas;

 case R.id.btn_add_new:
    initNewData();
    mDatas = mNewDatas;
    mAdapter.notifyDataSetChanged();
  break;
    ... ...

  private ArrayList<String> mNewDatas 
  private void initNewDatas() {
     mNewDatas = new ArrayList<>()
     mNewDatas.add("新集合1");
     mNewDatas.add("新集合1");
     mNewDatas.add("新集合1");
  }

如果我们通过上述的方式,试图为Adapter设置新的数据,那么你就大错特错了。这也就大家通常说的 notifyDataSetChanged() 方法不起作用了情况。大部分是处在下拉刷新的时候设置数据的情况。

解惑时间:

首先我们需要看到错误的情况和起初没有错误的情况的区别是什么,对!就是我们对mDatas赋值的操作。

正常情况:

mDatas.add("第" + i + "条目");

错误情况:

mDatas = mNewDatas;

如果我把这两句话单独列出来,然后问 这两个mDatas 还是同一个对象么? 相信大家都会异口同声的回答不是。 原因也很简单,表面解释如下:

mDatas 本身只是一个引用,而起初的 new ArraList<>()生成的对象和 mNewDatas已经不是同一个对象了。

往虚拟机深层解释就是:

mDatas为一个引用,位于内存中的栈内存,而new ArrayList(),和mNewDatas是对象,位于内存中的堆内存,一开始mDatas引用指向的是new ArrayList()的内存区域,这与Adapter中的mArrayList指向的是同一个对象。 而当我点击了下拉刷新之后,我们将mDatas指向了新的对象 mNewDatas,所以之后无论我们在怎么操作mDatas都跟Adapter没有关系了。

  • notifyDataSetChanged解惑

ok,解释到这种程度大家还可能有一个疑问就是notifyDataSetChanged是怎么工作的了,其实即使不了解这个方法的工作原理,通过上边的梳理,也能知道为什么数据不能正常刷新了。其实notifyDataSetChanged是ListView有名的设计方式之一 ——观察者模式。我们来简单看下它是怎么通知ListView更新数据的。

public abstract class BaseAdapter implements ListAdapter, SpinnerAdapter {
    private final DataSetObservable mDataSetObservable = new DataSetObservable();
   public void registerDataSetObserver(DataSetObserver observer) {
        mDataSetObservable.registerObserver(observer);
    }
   public void notifyDataSetChanged() {
       mDataSetObservable.notifyChanged();
   }

我们可以看到当我们BaseAdapter初始化的时候都会初始化一个数据被观察者:mDataSetObservable。当被观察者数据发生改变时,通知观察者。这个观察者是我们在ListVIew中系统为我们注册的:

 mDataSetObserver = new AdapterDataSetObserver();
 mAdapter.registerDataSetObserver(mDataSetObserver);

当我们调用notifyDataSetChanged方法就是通知AdapterDataSetObserver,数据有所改变,要你更新数据。在这个方法中,又调用了DataSetObserveable的notifyChanged方法:

    /**
     * Invokes {@link DataSetObserver#onChanged} on each observer.
     * Called when the contents of the data set have changed.  The recipient
     * will obtain the new contents the next time it queries the data set.
     */
    public void notifyChanged() {
        synchronized(mObservers) {
            // since onChanged() is implemented by the app, it could do anything, including
            // removing itself from {@link mObservers} - and that could cause problems if
            // an iterator is used on the ArrayList {@link mObservers}.
            // to avoid such problems, just march thru the list in the reverse order.
            for (int i = mObservers.size() - 1; i >= 0; i--) {
                mObservers.get(i).onChanged();
            }
        }
    }

通过上述方法描述我们大概就可以了解,我们调用notifyDataSetChanged方法实质是通知每个Observer去调用onChange方法,当然之后的源代码就不深入研究了( - - ! ),但是我们应该清楚一点,不是我们每次调用notifyDataSetChanged所有数据条目都会重新进行赋值,而是有改变的数据才会重新赋值。

小结:通过上述的探索我们应该明白之后我们在使用ListVIew的时候如何为起设置新的数据

  1. 方法一:
 mDatas.clear();
 mDatas.addAll(mNewDatas);
 mAdapter.notifyDataSetChanged();
  1. 方法二:

Adapter中的添加方法:

 public void refresh(ArrayList<String> list) { 
        mList = list; 
        notifyDataSetChanged(); 
    } 

外部调用:

mAdapter.refresh(mNewDatas);

所以我们只需要保证我们一直操作的是Adapter中的mArrayList即可。


ViewHolder是如何帮助我们提高效率的

在2103年Google开发者大会上,Google提出了ListView的正确使用姿势,即使用convertView和ViewHolder来提高效率。

这里关于ListView的复用机制就不再赘述,网上有好多讲解很详细的文章,随便一搜就一大堆。现在看下我们是如何使用VIewHolder的:

        @Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item, parent, false);
                holder = new ViewHolder();
                holder.mTextView = (TextView) convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.mTextView.setText(mArrayList.get(position));
            return convertView;
        }

        static class ViewHolder {
            TextView mTextView;
        }

相信学过Android的人现在应该对这种写法都可以达到默写的程度了。我们现在的问题主要有

  1. 在ListView中展示数据的时候我们共生成了多少个ViewHolder对象?
  2. setTag方法究竟做了什么?

我认为闹清楚这两点对于我们清楚VIewHolder工作原理有很大作用。

问题1: 在ListView中展示数据的时候我们共生成了多少个ViewHolder对象?

我们可以通过一个集合,来看下在ListVIew使用过程中共建立的多少个ViewHolder

private ArrayList<ViewHolder> mViewHolders = new ArrayList<>();


@Override
        public View getView(int position, View convertView, ViewGroup parent) {
            ViewHolder holder = null;
            if (convertView == null) {
                convertView = mInflater.inflate(R.layout.item, parent, false);
                holder = new ViewHolder();
                mViewHolders.add(holder);//每创建一个对象都存入集合中

                holder.mTextView = (TextView) convertView.findViewById(R.id.text);
                convertView.setTag(holder);
            } else {
                holder = (ViewHolder) convertView.getTag();
            }
            holder.mTextView.setText(mArrayList.get(position));

            Log.e("ViewHolder","ViewHolder的个数" + mViewHolders.size());//打印ViewHolder的个数
            return convertView;
        }

通过打印发现,ViewHolder最大的个数为7个,那么这个数字跟什么有关,其实是跟ListView什么时候开始复用convertView有关系。也就是等于一个屏幕能放下多少个条目+1的数量。

这里写图片描述

问题2: setTag方法究竟做了什么?

    /**
     * Sets the tag associated with this view. A tag can be used to mark
     * a view in its hierarchy and does not have to be unique within the
     * hierarchy. Tags can also be used to store data within a view without
     * resorting to another data structure.
     *
     * @param tag an Object to tag the view with
     *
     * @see #getTag()
     * @see #setTag(int, Object)
     */
    public void setTag(final Object tag) {
        mTag = tag;
    }

通过setTag方法的解释我们可以理解,View本身可以存储一个标志位,这个标志位可以是Object类型。其实就是当我们生成一个新的item view的时候我们将一个viewholder与该view进行绑定,当ListView开始服用convertView的时候我们通过getTag就可取出对应的View中的tag,从而获取之前findViewById的View,来进行新的数据设置。这一切都与convertView的复用机制相关联。如果你还不理解那么看下StrackOverFlow中的解释:

Android takes your convertView and puts it in its pool to recycle it and passes it again to you. but its pool may not have enough convertViews so it again passes a new convertView thats null. so again the story is repeated till the pool of android is filled up. after that android takes a convertView from its pool and passes it to you. you will find that its not null so you ask it where are my object references that I gave to you for the first time? (getTag) so you will get those and do whatever you like.
More elaboration on below line

but its pool may not have enough convertViews so it again passes a new convertView thats null

android pool is empty when your listView is going to create. so for the first item of your listView it sends you a convertView that must be displayed. after that android saves it in its pool, so its pool now contains just one convertView. for your second item of your listView that is going to create android can not use its pool because it is actually has one element and that element is your first item and it is being shown right now so it has to pass another convertView. this process repeates until android found a convertView in its pool thats not being displayed now and passes it to you.

Android inflates each row till the screen filled up after that when you scroll the list it uses holder.

上述解释与我描述的大同小异,但是英文描述可能更能表示出重点。

通过上述的探究我们明白了,ViewHolder的复用机制其实与ListVIew的Item的复用机制息息相关。我们还用改了解,ListVIew是可以展示布局条目类型的数据的。那么此时ViewHolder绑定的就是不同布局种的View,但是这并不影响,如果我们将ViewHolder当成一个条目中VIew的集合的话可能更好理解一些。

写在最后

其实这篇文章现在看起来有些过时了,毕竟ListView都快要淘汰了,但是对于刚步入Android大门的开发者来说,这些知识有必要掌握。这样才能有助于了解Android的工作模式。作为一个迈入进阶之门的小白来说,这些总结对我的提升也是蛮大的。欢迎大家指出我的理解错误。小弟将会及时更正。

listview中分列展示数据 listview控件就像windows资源管理器右边的内容视图,有大图标、小图标、列表、平铺、详细信息几种展示方式,我这次做的需要看目录下的文件夹和文件以及更新时间,另外再加个文件类型和大小,所以就使用详细信息的方式,具体做法如下: 1 在listview的属性窗口的View属性选择Details 2 Colomns属性中,添加需要的几列,并将Text改成要展示的列名字 3 阅读详情

相关推荐

WPF ListView绑定数据实例

WPF中ListView用来显示数据十分方便, 我们可以将它分成

晨曦的专栏 2万+

老潘 - ListView分析 - 学以致用篇(一)

ListView分析学以致用篇(1)在我们查看别人的博客的时候,一个人是一个风格的.先说下我的风格,我喜欢思想类比,然后介绍知识,不太喜欢填鸭式的灌输.如果只是想单纯的从我的博客中直接看到代码,我个人建议直接到网上搜索其他的案例,我喜欢一步一步的分析,然后分析完一个过程,会有一个对应的例子这个样子(1) 什么是ListViewListView 首先就是一个View,View顾名思义,就是用来展示数

潘永强_PandaPan的博客 1237

android可以输入数据,但是 ListView展示不出来数据,也没有提示错误。跪求大神帮忙

期末让完成一个商品展示的作品 代码如下 MainActivity package cn.itcast.product; import java.util.List; import cn.itcast.product.bean.Account; import cn.itcast.product.dao.AccountDao; import cm.example.test.R; import a...

weixin_44158748的博客 906

使用ListView控件展示数据------的详细解析

一.ImageList:存储图像集合 Images 存储的所有图像 ImageSize 图像的大小 ColorDepth 颜色数 TransparentColor 被视为透明的颜色 先设置ColorDepth、ImageSize属性值再添加图片,反之不能更改这两个属性值 二.ListView:存储项集合 Items ListView中的项 View 指定那种视图显示 ...

weixin_30256505的博客 691

Flutter(二):实现网络请求、json解析、ListView展示数据

效果图如下,用的接口数据是聚合数据的历史今日的接口 首先看Flutter的网络请求实现,我暂时简单实现了,放在HttpController里,实现代码如下: import 'package:http/http.dart' as http; class HttpController { static void get(String url, Function callback, ...

很久以前 2万+

使用JDBC在Android ListView中展示MySQL数据

本文还有配套的精品资源,点击获取 简介:本教程详细介绍了如何利用Java JDBC接口从MySQL数据库中读取数据,并将其展示在Android应用的ListView组件上。通过SimpleAdapter进行数据绑定,并实现点击事件处理,使用户能够通过WebView预览PDF文件。内容涵盖了JDBC的使用、数据交互、ListView的动态数据展示,以及在Android中利用W...

weixin_42594419的博客 2217

Android ListView分析

一.概述在android开发中ListView是比较常用的组件,它以列表的形式展示具体内容,并且能够根据数据的长度自适应显示。本文将着重介绍一个使用BaseAdatper适配器将数据库中的数据显示到界面的小案例。二.列表的显示需要三个元素:1.ListVeiw 用来展示列表的View。2.适配器 用来把数据映射到ListView上的中介。3.数据 具体的将被映射的字符串,图片,或者基本组件。三

张志阳 711

拼音检索与ListView数据展示实战

拼音处理技术是计算机科学领域中的一个重要分支,尤其在中文输入、文字识别以及自然语言处理等方面应用广泛。掌握拼音处理技术对于开发涉及中文字符集的应用程序尤为重要。ListView组件是Android平台上用于显示滚动列表的一个重要的视图组件。它可以显示任意数量的行,这些行的数据源通常来自一个数组、列表或者其他形式的数据集合。ListView通过适配器模式与数据源连接,每个列表项则由适配器返回对应的视图对象。

weixin_36149538的博客 1072

listview数据错乱、重复的原因分析与解决方案

目前我们使用listview展示数据时,adapter的getView方法通常使用convertView.setTag(viewHolder)的方式来避免出现卡顿的情况,这种方式能使convertView得以复用,避免重复的调用inflate方法渲染界面。但是,如果使用不当,可能会出现数据错乱、重复的问题,比如下面这个demo:这个demo是要listview在偶数行只显示大写字母,在奇数行既显示大

AndroidConqueror的博客 1万+

Android实战:通过ListView展示数据库数据完整实现

在明确了 RESTful 的设计理念之后,接下来需要根据实际业务需求进行具体的接口规划。这一阶段的目标是确定数据模型、设计合理的 URL 结构,并制定统一的响应格式,以便前后端高效协同开发。Retrofit通过接口注解的方式将HTTP API抽象为Java/Kotlin接口,极大地简化了网络请求的编写过程。它不直接执行网络操作,而是依赖OkHttp完成实际的TCP连接、请求发送与响应接收。这种分层设计使得Retrofit专注于API抽象,而OkHttp负责底层传输优化,二者协同工作形成完整的解决方案。

weixin_42590539的博客 670

EV1527 vs HS1527:固定码芯片的STM32解码避坑指南

本文深入解析EV1527与HS1527固定码芯片的技术差异,提供基于STM32的完整解码方案与稳定性优化策略。通过硬件接口配置、状态机实现及示波器诊断,解决工业遥控、安防报警等场景中的解码难题,特别针对时序差异和干扰问题给出实用解决方案。

o0p1q2r3的博客 329

android listview 分析,Android源码分析之ListView源码

前言ListView 是用来展示大量数据的控件,且不会因为展示大量数据而出现内存溢出的现象,其原因是相关缓存机制保证了内存的合理使用。ListView的使用也相对比较简单,大家也都会,现在官方基本都推荐使用RecyclerView去替代ListView,二者之间有相似之处,也有不同之处,本文先分析ListView的源码,重点是缓存的实现原理,后续再补充RecyclerView的原理分析,并将二者进...

weixin_32173041的博客 468

【实用教程】使用AlphaFold2进行蛋白质结构在线预测

使用Colab进行简单快速的AlphaFold2在线的蛋白质三维结构预测

Eumenidus的博客 14万+

C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改

C#-WinForm-ListView-表格式展示数据、如何将数据库中的数据展示到ListView中、如何对选中的项进行修改 在展示数据库中不知道数量的数据时怎么展示最好呢?——表格 ListView - 表格形式展示数据 ListView 常用属性 HeaderStyle - “详细信息”视图中列标头的样式。 None - 不显示列标头 Nonclickable - 不可点击 Clickable...

u012865252的博客 1759

<硬件设计> 阻抗设计(二) 使用Si9000计算阻抗

阻抗设计(二) 使用Si9000计算阻抗

杰克拉力船长个人博客 1万+

深入解析MSPM0系列Keil开发中‘ti_msp_dl_config.h‘缺失问题的根源与修复

本文深入解析TI MSPM0系列Keil开发中'ti_msp_dl_config.h'文件缺失问题的根源与修复方法。该错误常见于编译时提示file not found,主要因SysConfig工具未正确生成或工程路径配置错误导致。文章提供了从环境检查、手动生成文件到工程配置调整的系统化解决方案,帮助开发者快速解决这一常见KEIL开发难题。

gold的博客 969

Android开发使用SQLite数据库和Listview实现数据的存储与展示

使用SQLite数据库和Listview存储用户的名字和年龄,并且在listview中显示出来。

qq_50982405的博客 7804

2025年开源气象大模型的实现原理与实践指南

气象大模型在人工智能时代实现了革命性突破,通过深度学习技术以更低的计算成本达到甚至超越传统数值天气预报的精度。开源气象大模型的出现使得全球研究者和机构都能参与气象AI的创新。本文详细解析了开源气象大模型的实现原理,包括核心架构、数据准备、训练方法和实际预测流程,并提供了实践指南。核心架构主要采用Transformer、图神经网络和扩散模型,处理多模态数据融合和时空联合建模。数据体系构建涉及数据来源、预处理和增强策略。模型训练关键技术包括损失函数设计、分布式训练优化和训练过程监控。微调与领域适应策略包括迁移学

专注AI大模型,软件混淆,授权 1179

android xml 列表展示,Android中ListView实现展示列表数据

1、在activity_main.xml中添加一个ListViewxmlns:tools="http://schemas.android.com/tools"android:layout_width="match_parent"android:layout_height="wrap_content"android:orientation="vertical"tools:context="${rel...

weixin_33443972的博客 623

如何在飞腾平台上安装Ubuntu操作系统

注意: 若主板上配置的是NVME硬盘,在进行内核配置时,需要将内核的NEME驱动勾选上,否则移植内核时,无法找到文件系统,进不去操作系统。可以通过rufus软件将镜像做到U盘中,本次使用版本为Rufus 3.9.124 ,其他版本也可以。不要下载live版本的,没有准备网络环境,是一个头疼的事情,笔者暂时没有实现网络安装。将U盘接到主板usb口上,接上串口,显示器,,必需串口有打印才可以安装。可以通过dd命令,将iso安装到U盘。安装的是最小系统,缺少很多命令,需要联网更新,或则更换飞腾专用内核。

技术联盟 2641

数据库系统概论第五版课后习题答案第十二章

对元组的插入、删除、修改;语义检查的具体做法是,DBMS读取数据字典,检查是否存在与该语句中的表、视图或索引等要创建的对象相同的对象名,检查该用户是否具有创建数据库对象的权限。答:操作系统提供的封锁机制和DBMS的封锁机制在封锁对象、封锁对象的状态、封锁的粒度、及封锁的类型上存在很大的差别,操作系统的封锁机制不能直接应用在DBMS中,DBMS必须重新设计,来满足复杂的封锁需求。数据库的建立和维护包括数据库的初始建立、数据的转换、数据库的转储和恢复、数据库的重组织和重构造以及性能监测分析等功能。

wenling54321的博客 693

解析网络json数据并展示到ListView上

网易新闻看起来很简洁,左边是一张图片,右边是一些文字信息,这样的排版是十分常见的,给人的感觉就是简洁明了,下面通过解析网络json数据并展示到ListView上,来实现同样的效果,效果图如下: 1.数据来源于网上json数据的解析,网址为http://mrobot.pcauto.com.cn/v2/cms/channels/3?pageNo=1&pageSize=20&v=4.0

ljw的博客 8081

药物对接仿真软件:HADDOCK_(5).HADDOCK中蛋白质-配体对接流程

半柔性能量最小化阶段是在刚体能量最小化的基础上,允许配体的部分柔性,通过优化配体的构象来进一步提高对接的准确性。半柔性能量最小化阶段是在刚体能量最小化的基础上,允许配体的部分柔性,通过优化配体的构象来进一步提高对接的准确性。如果是PDB格式,确保文件包含所有必要的原子信息。对接完成后,HADDOCK会生成一系列的输出文件,包括对接后的蛋白质-配体复合物结构文件、能量评分文件和统计分析文件。对接完成后,HADDOCK会生成一系列的输出文件,包括对接后的蛋白质-配体复合物结构文件、能量评分文件和统计分析文件。

kkchenjj的博客 1078

ListView展示数据

第一步:XML布局 &lt;ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="match_parent"&gt; &lt;/ListView&gt; 第二步:AsyncTask方法 public cl...

weixin_44310617的博客 409

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

使用ListView控件展示数据

课后作业五 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using

qq_36074150的博客 1054

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

Json数据的解析展示到ListView中

package com.qy.week01.frag; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.support.annotation.NonNull; import android.support.annotation.Nullable; impor...

weixin_44259908的博客 896

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

上一篇: 关于LayoutInflate和View-infalte的参数意义以及区别总结
下一篇: 理解Android客户端POST请求参数
Yoda_wang
博客等级 码龄11年 60粉丝 37原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值