使用draw9patch

  1. 打开内置terminal
  2. 输入CD C:\Users\Gaby\AppData\Local\Android\sdk
  3. 在该目录下输入draw9patch
  4. 导入图片,开始绘制
  5. 本文成果图:

成果图

  1. 左边和上边绘制的黑线,表示在纵向和横向拉伸时拉伸的部分。右边和下边的黑线表示要用于显示内容的部分
  2. 从图片上可以看出,右边和下边的黑线可以偏中间一点

上代码

首先写MainActivity,先只考虑需要哪些功能,不去管如何实现

1
2
3
4
5
6
7
8
9
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);//首先写活动主布局文件
ListView listV = (ListView) findViewById(R.id.listView);
initData(); //接着写类和initData函数
//单项布局文件,然后写adapter类
mess_adapter adapter = new mess_adapter(MainActivity.this,R.layout.item_layout,mesgLists);
listV.setAdapter(adapter);
}

顺序是:MainActivity->活动布局文件->Item类->Item类对象的集合->初始化该集合->item_layout单项布局->adapter类

活动布局文件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
<LinearLayout
android:orientation="vertical"/>
android:background="#d8e0e8"> <ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="0dp"
android:divider="#0000"
android:layout_weight="1"
>
</ListView> <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content">
<EditText
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="1"
android:hint="input your message"/>
<Button
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Send"/>
</LinearLayout>
</LinearLayout>

注意:

  • android:divider="#0000"该项用于设置ListView的的分割线为透明
  • 输入框和button通过LinearLaout绑定在一起
  • 最外LinearLayoutorientation设置为vertical是让ListView和内LinearLayout上下放置
  • ListView设置height = "0dp" weight = "1"切内LinearLayout无设置,意思就是,在保证内LinearLayout的区域大小后,其他空间都归ListView,同理内LinearLayout的EditText和Button

Item类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
public class Item {
public static final int SEND = 1;
public static final int REC = 0;
private int type;
private String content; public Item(int wtype, String content){
this.type = wtype;
this.content = content;
} public int getType() {
return type;
} public String getContent() {
return content;
}
}

注意:

  • 如果要在MainActivity中使用SEND来给一个Item对象赋值,那么这个SEND常量就一定得在Item类中定义

Item类对象的集合->初始化该集合

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
private List<Item> mesgs = new ArrayList<Item>();

 private void initData() {
Item con_a = new Item(Item.REC,"hello my name is Gaby");
mesgLists.add(con_a);
Item con_b = new Item(Item.SEND,"Hi,Gaby! I'm Cici");
mesgLists.add(con_b);
Item con_c = new Item(Item.SEND,"where are you come from?");
mesgLists.add(con_c);
Item con_d = new Item(Item.REC,"I'm from China");
mesgLists.add(con_d); Item con_e = new Item(Item.SEND,"oh? I come from Japan");
mesgLists.add(con_d); Item con_f = new Item(Item.REC,"so you must know yui hatano");
mesgLists.add(con_f); Item con_g = new Item(Item.SEND,"I do,she is the best");
mesgLists.add(con_g);
}

item_layout单项布局

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"> <LinearLayout
android:id="@+id/left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/qq"
android:layout_gravity="left">
<TextView
android:id="@+id/tv_left"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
/>
</LinearLayout> <LinearLayout
android:id="@+id/right"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_gravity="right"
android:background="@drawable/oo">
<TextView
android:id="@+id/tv_right"
android:layout_width="wrap_content"
android:layout_height="wrap_content" />
</LinearLayout> </LinearLayout>

注意:

  • android:orientation="vertical"以及两个LinearLayout中各自的android:layout_gravity="left"android:layout_gravity="right"
    使得单项布局中的两个对话框一左一右垂直排列
    item_layout
  • 实际上对话框中带有TextView,因为LinearLayout中的两个属性都是wrap_content

adapter类

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
public class mess_adapter extends ArrayAdapter<Item>{

    private int resourceId;

    public mess_adapter(Context context,int textViewResourceId, List<Item> objects) {
super(context,textViewResourceId, objects);
resourceId = textViewResourceId;
} @Override
public View getView(int position, View convertView, ViewGroup parent) {
View view;
ViewHolder viewHolder;
Item item = getItem(position);
if(convertView == null){
viewHolder = new ViewHolder();
view = LayoutInflater.from(getContext()).inflate(resourceId,null);
viewHolder.left_layout = (LinearLayout) view.findViewById(R.id.left);
viewHolder.right_layout = (LinearLayout) view.findViewById(R.id.right);
viewHolder.tv_right = (TextView) view.findViewById(R.id.tv_right);
viewHolder.tv_left = (TextView) view.findViewById(R.id.tv_left);
view.setTag(viewHolder);
} else{
view = convertView;
viewHolder = (ViewHolder) view.getTag();
}
if(item.getType() == Item.SEND){//send is in the left
viewHolder.right_layout.setVisibility(View.GONE);
viewHolder.tv_left.setText(item.getContent());
} else{
viewHolder.left_layout.setVisibility(View.GONE);
viewHolder.tv_right.setText(item.getContent());
}
return view;
} class ViewHolder{
LinearLayout left_layout;
LinearLayout right_layout;
TextView tv_left;
TextView tv_right;
}
}

注意:

  • 因为不能通过一个布局去取得布局中的控件,也因此,每个控件都设置id
  • viewHolder存放着四个控件实例

二探ListView的更多相关文章

  1. AQS源码二探-JUC系列

    本文已在公众号上发布,感谢关注,期待和你交流. AQS源码二探-JUC系列 共享模式 doAcquireShared 这个方法是共享模式下获取资源失败,执行入队和等待操作,等待的线程在被唤醒后也在这个 ...

  2. Android Widget 开发详解(二) +支持listView滑动的widget

    转载请标明出处:http://blog.csdn.net/sk719887916/article/details/47027263 不少开发项目中都会有widget功能,别小瞧了它,他也是androi ...

  3. WPF入门教程系列二十——ListView示例(二)

    第四步.WPF后台逻辑代码编写 在后台用Entity Framework 6.1的Code First方式获取数据库中的数据.同时,在“刷新”按钮的方法中进行数据绑定.操作步骤如下: 1)  在“刷新 ...

  4. android技巧(二)listview的优化

    对于listview的优化有以下三个措施: 1.原有listview每一个item显示时都会调用一次getView()方法,实际上对于ListView而言,只需要保留能够显示的最大个数的view即可, ...

  5. android 项目学习随笔十二(ListView加脚布局)

    1.ListView加脚布局 头布局initHeaderView,在onTouchEvent事件中进行显示隐藏头布局切换 脚布局initFooterView,实现接口OnScrollListener, ...

  6. Android基本控件之ListView(二)<ListView优化>

    之前我们说到ListView的基本用法.但是,有很多的时候会额外的占用一些内存,从而消耗了性能.既然有消耗性能的可能,那么我们就对其做出相应的优化 我们首先来说说优化的步骤: 第一步.将宽和高设置为填 ...

  7. 老司机学新平台 - Xamarin Forms开发框架二探 (Prism vs MvvmCross)

    在上一篇Xamarin开发环境及开发框架初探中,曾简单提到MvvmCross这个Xamarin下的开发框架.最近又评估了一些别的,发现老牌Mvvm框架Prism现在也支持Xamarin Forms了, ...

  8. listview下拉刷新和上拉加载更多的多种实现方案

    listview经常结合下来刷新和上拉加载更多使用,本文总结了三种常用到的方案分别作出说明. 方案一:添加头布局和脚布局        android系统为listview提供了addfootview ...

  9. Android开发之自定义的ListView(UITableViewController)

    Android开发中的ListView, 顾名方法思义,就是表视图.表示图在iOS开发中就是TableView.两者虽然名称不一样,但是其使用方法,使用场景以及该控件的功能都极为相似,都是用来展示大量 ...

随机推荐

  1. location.href IE6 下不起作用的罪魁祸首

    解决问题 在btn_publish函数内逻辑最后面加:return false;

  2. MSSQL 常用内置函数

    一.判断表是否存在 IF objectproperty(object_id(@tableName),'IsUserTable') IS NOT NULL PRINT '存在' ELSE PRINT ' ...

  3. m元素集合的n个元素子集

    理论: 假设有5个元素的集点,取出3个元素的可能子集如下:{1 2 3}.{1 2 4 }.{1 2 5}.{1 3 4}.{1 3 5}.{1 4 5}.{2 3 4}.{2 3 5}.{2 4 5 ...

  4. Cocos2d-x v3.0正式版尝鲜体验【1】 环境搭建和新建项目

    Cocos2d-x v3.0在前天最终公布正式版了,等了大半年最终出来了.一直没去碰之前的3.0各种beta,rc版本号,就想等正式版出来再尝试. 昨天也參加了触控科技在成都举办的沙龙活动.看到作者王 ...

  5. 【Unity3d】【项目学习心得】从资源server下载资源(一)

    项目里面的很多资源都是从资源server载入的,这样子能够减小client的包大小. 所以我们须要一个专门的类来管理下载资源. 资源分非常多类型,如:json表,txt文件,image文件,二进制文件 ...

  6. uva 714 - Copying Books(贪心 最大值最小化 二分)

    题目描写叙述开头一大堆屁话,我还细致看了半天..事实上就最后2句管用.意思就是给出n本书然后要分成k份,每份总页数的最大值要最小.问你分配方案,假设最小值同样情况下有多种分配方案,输出前面份数小的,就 ...

  7. java值传递

    Java使用按值传递的函数调用方式,这往往使我感到迷惑.因为在基础数据类型和对象的传递上,我就会纠结于到底是按值传递,还是按引用传递.其实经过学习,Java在任何地方,都一直发挥着按值传递的本色. 首 ...

  8. mysq优化

    MySQL调优可以从几个方面来做:1. 架构层:做从库,实现读写分离: 2.系统层次:增加内存:给磁盘做raid0或者raid5以增加磁盘的读写速度:可以重新挂载磁盘,并加上noatime参数,这样可 ...

  9. CentOS 7 U盘安装解决找不到U盘问题

    在使用U盘进入CentOS7系统安装选项时,按下Tab键,在屏幕下方出现:vmlinuz initrd=initrd.img inst.stage2=hd:LABEL=CentOS\x207\x20x ...

  10. 改变VS2013的菜单栏字母为小写

    REG ADD HKCU\Software\Microsoft\VisualStudio\12.0\General /v SuppressUppercaseConversion /t REG_DWOR ...