自定义ListView

我们在进行Android方面的开发时,追求的是个性化,自由化,所以一些控件都有自定义类型,ListView的三要素是listview控件本身,数据,适配器,下面展示ListView的使用方法还有在使用的时候出现的一些问题(本案例中使用的是web方式存储数据):

首先在你需要使用ListView的xml页面加入该控件:

  <ListView
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:id="@+id/mlistView"
    android:layout_gravity="center_horizontal" />

第二,我们需要做数据,本案例使用web存储数据,所以接下来展示web方向的代码(因为web只是获取数据,所以不过多注解):

1.链接数据库的类在这里省略(DbUtils)

2添加Java bean 对象

public class Hospital {

private int id,age;

private String name,birthplace;

public int getId() {

return id;

}

public void setId(int id) {

this.id = id;

}

public int getAge() {

return age;

}

public void setAge(int age) {

this.age = age;

}

public String getName() {

return name;

}

public void setName(String name) {

this.name = name;

}

public String getBirthplace() {

return birthplace;

}

public void setBirthplace(String birthplace) {

this.birthplace = birthplace;

}

}

3.接下来在做一些逻辑层代码

package com.scme.dao;

import java.sql.Connection;

import java.sql.PreparedStatement;

import java.sql.ResultSet;

import java.sql.SQLException;

import java.util.ArrayList;

import java.util.List;

import com.scme.pojo.Hospital;

import com.scme.utils.DbUtils;

public class HostpitalDao {

private static Connection conn;

private static PreparedStatement ps;

private static ResultSet rs;

private static List<Hospital> cList;

public List<Hospital> queryAll(){

cList = new ArrayList<Hospital>();

try {

conn = DbUtils.getConnection();

String sql = "select * from demo";

ps = conn.prepareStatement(sql);

rs = ps.executeQuery();

while(rs.next()){

Hospital n = new Hospital();

n.setId(rs.getInt(1));

n.setName(rs.getString(2));

n.setBirthplace(rs.getString(3));

n.setAge(rs.getInt(4));

cList.add(n);

}

} catch (ClassNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (SQLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return cList;

}

}

4.最后在servlet 操作

public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

request.setCharacterEncoding("utf-8");

response.setCharacterEncoding("utf-8");

response.setContentType("text/html");

PrintWriter out = response.getWriter();

HostpitalDao dao = new HostpitalDao();

List<Hospital> mlist = dao.queryAll();

Gson gson = new Gson();

String str = gson.toJson(mlist);

System.out.println(str);

out.write(str);

out.flush();

out.close();

}

在添加数据后,需要在Android端获取数据

package com.example.haichao.listviewdemo;

import android.app.Activity;

import android.os.Bundle;

import android.os.Handler;

import android.os.Message;

import android.widget.ListView;

import android.widget.Toast;

import org.json.JSONArray;

import org.json.JSONException;

import org.json.JSONObject;

import java.io.BufferedReader;

import java.io.IOException;

import java.io.InputStreamReader;

import java.net.HttpURLConnection;

import java.net.URL;

import java.util.ArrayList;

import java.util.List;

/**

* Created by Administrator on 2017/3/31.

*/

public class ShowHostpital extends Activity {

private ListView listView ;

@Override

protected
void
onCreate(Bundle
savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main_doctor);

//绑定控件

listView = (ListView) findViewById(R.id.mlistView);

//从web端接受数据。

getURLJsonData();

}

//使用Handler做异步任务

Handler mHandler
= new Handler(){

public void handleMessage(Message msg) {

if(msg.what == 99) {

String jsonStr = String.valueOf(msg.obj);

List <Hostptial>
list = new ArrayList<Hostptial>();

try {

JSONArray array = new JSONArray(jsonStr);

for(int i=0; i<array.length(); i++) {

JSONObject json =
new JSONObject(array.getJSONObject(i).toString());

//在获取数据后添加到实体类中

Hostptial info = new Hostptial();

info.setId(Integer.parseInt(json.getString("id")));

info.setName(json.getString("name"));

info.setBirthplace(json.getString("birthplace"));

info.setAge(Integer.parseInt(json.getString("age")));

list.add(info);

}

// 
Toast.makeText(ShowHostpital.this, "
共有" + list.size() + "行", Toast.LENGTH_SHORT).show();

listView.setAdapter(new
Adptor( ShowHostpital.this,list));

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

};

};

/**

* 使用URL方式从web端取json数据

*/

private void getURLJsonData() {

new Thread(new Runnable() {

@Override

public void run() {

// TODO Auto-generated method stub

try {

URL url = new URL("http://192.168.155.7:8080/DoctorApp/HospitalServlet");

HttpURLConnection
conn = (HttpURLConnection) url.openConnection();

if(conn.getResponseCode()
== 200) {

BufferedReader br
= new BufferedReader(new InputStreamReader(conn.getInputStream()));

String
responseText = br.readLine();

Message msg = new Message();

msg.what = 99;

msg.obj = responseText;

mHandler.sendMessage(msg);

}

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

}

}).start();

}

}

还需要在你的另一个xml页面设置其中的子布局,使用布局可以按照所需要的布局进行罗列,这个布局在listview显示的只是其中的一行。(为了方便每一行的图片定义死了)

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"

android:layout_width="match_parent"

android:layout_height="match_parent"

android:orientation="horizontal"

>

<ImageView

android:id="@+id/mpic"

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:background="@mipmap/hospital_img"

/>

<LinearLayout

android:layout_width="wrap_content"

android:layout_height="wrap_content"

android:orientation="vertical"

android:layout_weight="3"

>

<TextView

android:id="@+id/a"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"/>

<TextView

android:id="@+id/b"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"/>

<TextView

android:id="@+id/c"

android:layout_width="match_parent"

android:layout_height="wrap_content"

android:layout_weight="1"/>

</LinearLayout>

</LinearLayout>

接下来就是使用适配器进行绑定了:

package com.example.haichao.listviewdemo;

import android.content.Context;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.BaseAdapter;

import android.widget.TextView;

import java.util.List;

/**

* Created by haichao on 2017/4/5.

*/

public class Adptor extends BaseAdapter {

private Context context;

private List<Hostptial> list;

public Adptor(Context
context, List<Hostptial> mlist){

this.context = context;

this.list = mlist;

}

@Override

public int getCount() {

return list.size();

}

@Override

public Object
getItem(int i) {

return null;

}

@Override

public long getItemId(int i) {

return 0;

}

@Override

public View
getView(int i, View v, ViewGroup viewGroup) {

v = LayoutInflater.from(context).inflate(R.layout.bottom_bar2,null);

((TextView)v.findViewById(R.id.c)).setText(String.valueOf(list.get(i).getAge()));

((TextView)v.findViewById(R.id.a)).setText(list.get(i).getName());

((TextView)v.findViewById(R.id.b)).setText(list.get(i).getBirthplace());

return v;

}

}

最后完成的效果就是:

效果特别丑,凑活看

所出现的问题:

  1. 在适配器绑定数据的地方位置搞错了(如图):

在最后控制台报错:

这个问题归根结底是太马虎了

2.在控制台没有报错,但是在打开项目的时候,很抱歉项目已停止运行(如图):

原因:

在Android中对于编码比较苛刻,在适配器中,的settext中只能加入string类型的,因为没有转型所以在项目中报错。加String.valueOf就完事了、

注:本人只是一个Android初学者,如果所写文字有不恰当,或者不对的地方请留言

时间: 2024-08-25 12:52:06

自定义ListView的相关文章

自定义ListView的点击Item项后进入另一个activity背景色改变在pressed或selected等状态时的颜色

在点击进入另一个activity时颜色改变是想在游戏攻略中实现的,但查资料找不到结果,今天突发灵感终于实现了. 我们大多数情况下都是自己写adapter,在写的那个Class中定义一个 boolean 型的 IsJump.然后在 OnItemClickListener 中 把 IsJump 设置为ture,再adapter2.notifyDataSetChanged();  在Adapter中 ture 的情况设置一种颜色就解决问题标记是否读过了.' 自定义ListView的Item项在pres

android之ListView,详细介绍实现步骤,举例,自定义listview适配器

android之ListView,详细介绍实现步骤,举例,自定义listview适配器 09. 四 / android基础 / 没有评论 本文来源于www.ifyao.com禁止转载!www.ifyao.com android中如何使用listView是比较重要的,因为很多时候都需要将数据库中的数据以列表显示, 具体使用步骤:大体 1,建立一个item.xml文件,此布局文件布局布局如何具体显示列表中的每一个条目 2,在要使用listview的界面中添加listview控件. 3,activit

自定义ListView动态加载数据

我们都知道网络取数据是耗时操作,如果我们一次性请求所有数据,假如数据量不多那还可以接受,但是如果数据量特别多,那么带来的后果就是用户的愤怒(用户是很没有耐心的),所以这时候我们就需要动态的加载数据,分批加载我们所需的数据,提升用户体验,先上图.           一般如果一个Activity集成越多的功能,代码量也会随之增多,看起来让人烦,我们可以考虑自定义控件将一些操作集成进去. 自定义ListView 1 package com.example.listviewdynamicloading

android开发最常用例子整理----(3)自定义ListView(自定义BaseAdapter实现)

在上一个教程中,我们使用SimpleAdapter实现自定义ListView,但是有一点不方便的是,如果要对每一个ListView的item选项进行不同的样式设置,就很麻烦,因为SimpleAdapter使用的是统一的风格样式.如果要实现不同item使用不同的风格样式,那么就要通过集成BaseAdapter来实现. 一.Activity MainActivity.java源码: public class MainActivity extends Activity { @Override prot

android开发(33) 自定义 listView的分割线( 使用xml drawable画多条线)

我遇到这样一个场景,我需要自定义 listView的分割线,而这个分割线是由两条线组成的,在使用xml drawable时遇到了困难. 注释:画两条线是为了实现 凹陷的效果,在绘图中一条暗线紧跟着一条明显会给人视觉上产生明显的“沟”的感觉. 因为我的背景是透明(背景渐变)的,直接用图片来实现效果不好. 看看效果: 使用 layer-list 来实现. layer-list 可以包含多个item,每个item堆叠在一起. layer-list  的item可以设置 间距,使用  android:b

Android复杂自定义Listview实现

在Android中实现Listview对新人来说比较难以理解,本人看了若干文章后觉得可以使用以下思路来让新人更好理解(同时也做好记录,免得自己以后忘记). 可参考博客:http://cinderella7.blog.51cto.com/7607653/1281696  (这里用MVC的思想去理解Listview,个人认为还是不错的) http://blog.csdn.net/jueblog/article/details/11857281   (一个完整的实现) ----------------

探索SwipeRefreshLayout配合自定义ListView完成下拉刷新、滑到底部自动加载更多

在Android开发过程中经常需要实现上下拉刷新功能,Google推出的下拉刷新控件SwipeRefreshLayout(彩虹条),由于官方版本只有下拉刷新而没有上拉加载更多的功能,很多人也尝试在这个基础上进行改写.今天尝试一下使用SwipeRefreshLayout配合自定义ListView实现下拉刷新.滑到底部自动加载更多的功能. 效果图如下所示,在进入页面的时候加载自动刷新,滑到底部自动加载更多,当数据已经加载完成则显示已经加载完成,,否则上拉任可继续加载 先贴一下项目结构图吧,这样可能对

深入理解自定义ListView

深入理解自定义ListView ListView原理 他是一个系统的原生控件,用列表的形式来显示内容.如果内容过过有1000条左右,我们可以通过手势的上下滑动来查看数据.ListView也不是爆出OOM(out of memery)错误.下面是类的继承机构 我们给ListView装配数据的时候,要给他定义一个适配器Adapter,为什么要定义呢? 我的理解是给ListView一个通道,在和我们的数据之间建立一个连接,这样当ListView需要展现什么的数据,什么样的布局的时候我们就可以通过自己定

android自定义listview实现圆角

在项目中我们会经常遇到这种圆角效果,因为直角的看起来确实不那么雅观,可能大家会想到用图片实现,试想上中下要分别做三张图片,这样既会是自己的项目增大也会增加内存使用量,所以使用shape来实现不失为一种更好的实现方式.在这里先看一下shape的使用: [html] view plaincopy <?xml version="1.0" encoding="utf-8"?> <shape xmlns:android="http://schema

Android中自定义ListView无法响应OnItemClickListener中的onItemClick方法问题解决方案

如果你的自定义ListViewItem中有Button或者Checkable的子类控件的话,那么默认focus是交给了子控件,而ListView 的Item能被选中的基础是它能获取Focus,也就是说我们可以通过将ListView中Item中包含的所有控件的focusable属性设置为 false,这样的话ListView的Item自动获得了Focus的权限,也就可以被选中了 我们可以通过对Item Layout的根控件设置其android:descendantFocusability="blo