-
笔者初心,向来不喜说道,前日反思,多废语连篇,不与人干货,今思虑有三,鄙人目有短视,不该舞文弄墨,故弄玄虚,伤读者老爷们之心。在此言说抱歉,望海涵。
- 我撰文不挣一分,不拿一块,全凭心中好恶,一鼓作气,不读二遍,但技术不与它文同,技术之最大诱惑,在于其有一为一,严谨细致,不能有二,我为文一鼓作气不赖。但表文同之,个中问题随之而现,现今反思,尤为心惊。故今定矩有三:其一、字字而珠玑;其二、三日方成文;其三,不忘与己心;其四,理为理,不为人之理,道为道,必从头言道。
青,取之于蓝,而青于蓝;冰,水为之,而寒于水。
实例1、效果如下图:
现在来说道说道:简单说来,ListView应该是一个聪明的懒人发明的。他用这个方式,大大提高了工作效率。简单的文字列表,只需要四步:
第一步、声明数据、适配器以及你在布局文件中的
ListView,并且还要绑定ListView事件咯:
private String[] proNames; private ArrayAdapter<String> adapter; private ListView lvProlist;
第二步、准备数据
this.proNames = new String[]{"负离子去螨器", "多功能料理机", "多可必搅拌棒", "可可早餐机", "亚美面条机", "双立人料理蒸锅地网","...."};
第三步、视图层你有了个列表,但是列表里面的内容还没有填充,我这个是填充的文字,所以要有一个独立出来的布局文件:
<?xml version="1.0" encoding="utf-8"?>
<TextView xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:padding="8dp"
android:textColor="#A10000">
</TextView>
第四步、是准备并绑定适配器(准备适配器是为了找到布局内容,绑定适配器,是将listView再和适配器绑定):
// 准备适配器
this.adapter = new ArrayAdapter<String>(getApplicationContext(), R.layout.lv_item, proNames);
// 绑定适配器
this.lvProlist.setAdapter(adapter);
而后就大功告成,源码地址如下:http://pan.baidu.com/s/1jHD7I9w
下面来看看ListView的进阶态:
- 当ListView内容复杂的时候,我们的数据源也就变得复杂了,所以最好有个实体类,一般实体类一般放到了持久层中,适配器一般写在工具类里面,我这里只是举例子,所以持久层写到了一起:
- 第一步、写出实体类:
package com.chinasoft.listviewdemo;
/**
* Created by Arvin on 2017/2/20.
*/
public class Product {
private int pid;
private String name;
private float price;
private String desc;
private int image;
public Product(int pid, String name, float price, String desc, int image) {
this.pid = pid;
this.name = name;
this.price = price;
this.desc = desc;
this.image = image;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getDesc() {
return desc;
}
public void setDesc(String desc) {
this.desc = desc;
}
public int getImage() {
return image;
}
public void setImage(int image) {
this.image = image;
}
}
第二步、写出适配器的工具类(要记得适配器一般和小布局属关联的,List和适配器是关联)适配器的作用是侨联就像口,胃之间有食道一样:
package com.chinasoft.listviewdemo;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;
import java.util.List;
/**
* Created by Arvin on 2017/1/20.
*/
public class ProductListAdapter extends BaseAdapter {
private Context context;
private List<Product> products;
public ProductListAdapter(Context context, List<Product> products) {
this.context = context;
this.products = products;
}
@Override
public int getCount() {
return products.size();
}
@Override
public Object getItem(int position) {
return products.get(position);
}
@Override
public long getItemId(int position) {
return position;
}
@Override
public View getView(final int position, View convertView, ViewGroup parent) {
// 获取小布局
if(convertView == null){
convertView = LayoutInflater.from(context).inflate(R.layout.lv_pro_item, null);
}
// 获取小布局中的组件
ImageView ivProImage = (ImageView) convertView.findViewById(R.id.iv_pro_image);
TextView tvProId = (TextView) convertView.findViewById(R.id.tv_pro_id);
TextView tvProName = (TextView) convertView.findViewById(R.id.tv_pro_name);
TextView tvProPrice = (TextView) convertView.findViewById(R.id.tv_pro_price);
TextView tvProDesc = (TextView) convertView.findViewById(R.id.tv_pro_desc);
// 给组件设置数据
Product product = products.get(position);
ivProImage.setImageResource(product.getImage());
tvProId.setText(product.getPid()+"");
tvProName.setText(product.getName());
tvProPrice.setText("¥" + product.getPrice());
tvProDesc.setText(product.getDesc());
// 返回小布局视图
return convertView;
}
}
第三步、数据的初始化,以及新增操作:
package com.chinasoft.listviewdemo;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class ProductShowActivity extends AppCompatActivity {
private List<Product> products;
private ListView lvProduct;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_product_show);
this.lvProduct = (ListView) findViewById(R.id.lv_product);
// 初始化产品数据
this.products = new ArrayList<Product>();
Product pro1 = new Product(1001,"艾静吸尘器",1200,"超静音八遍系成绩,能铣刀各个觉喽哦,不放过任何一个死角",R.drawable.pro01);
products.add(pro1);
Product pro2 = new Product(1002,"高级电饭锅",2388,"香喷喷的米饭由此而生",R.drawable.pro04);
products.add(pro2);
Product pro3 = new Product(1003,"负离子去螨器",890,"香喷喷的螨虫,你想如何处置", R.drawable.pro06);
products.add(pro3);
Product pro4 = new Product(1004,"多功能料理机",2359,"功能丰富,随心所欲。。。。", R.drawable.pro08);
products.add(pro4);
Product pro5 = new Product(1005,"多可必搅拌棒",300,"操作方便,随时随地都可以获取新鲜食物。",R.drawable.pro10);
products.add(pro5);
ProductListAdapter adapter = new ProductListAdapter(getApplicationContext(), products);
this.lvProduct.setAdapter(adapter);
}
}
布局文件就不写了,源代码地址如下:http://pan.baidu.com/s/1gfol6EZ
接下来跟大家聊聊开发规范中的“包名问题”,package的包名,其实很困扰初学者。对于许多成熟的开发者而言,不同的包里放不同的类,对于自身逻辑的梳理,很有帮助。下面来说说(大家还是先看图):
上图箭头所指的就是(部分)包名,包名的命名,其实也因人而异,所以介绍些常规的:
- dao:和数据库有关(DB)的操作类,一般写在这里面
- utils:一般放一些工具类,如有的人会在Android开发中,会把数据库的建表等操作放到这里。
- sqlite : 像我提供的范例图中那样,我把跟数据库有关的操作,放到了那里面~个人习惯。
- vo层:有的人也叫entity或者domain,这是持久层的意思,所谓持久嘛,放的都是一些实体类,一般这里面的东西是不会动的。
- fagment : 这里面放的就是一些Fragment,个人觉得和Activity差不多,但是有区别哟。
- common:通用工具包,我曾经在这里放过一些全局变量。
- adapter : 一般用在Android开发中,会写一些适配器,比如:ListView<>就需要适配器咯。
- application : 一般这个东西,都是系统自带的,但是要想自己写的话,记得要继承Application。
- service层:Service层主要负责业务模块的逻辑应用设计。
- controller层 :控制层,Android中,还真不常见到。
- ui:在Android开发中,有的程序员喜欢把跟布局有关的类,写在ui中,但是,有的人也喜欢写在外面,笔者属于第二种。
-
view:这个其实多负责页面的表示。
注:学问之最大不同,在于其底基相同,同样的语言,同样的架构,得出同样的道理,这很自然,故在此声明:如全文摘录,请注明出处。
慕课网:http://www.imooc.com/u/4102287
CSDN:http://blog.csdn.net/baidu_34750904
简 书:http://www.jianshu.com/u/6db129d0ef0f