使用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. Java Socket 简单梳理

    Sockets let you send raw streams of bytes back and forth between two computers, giving you fairly lo ...

  2. sh里没有多行注释,只能每一行加一个#号

    sh里没有多行注释,只能每一行加一个#号.只能像这样: #-------------------------------------------- # 这是一个自动打ipa的脚本,基于webfrogs ...

  3. 精美的 ( Android, iPhone, iPad ) 手机界面设计素材和线框图设计工具

    在制作界面原型的时候,如果有现成的界面基础元素可以使用的话,设计师就可以非常快速的完成原型的制作,能够节省大量的时间和精力.在这篇文章, 我向大家分享45套非常有用的 UI 和 Wireframe 套 ...

  4. Red and Black(BFS or DFS) 分类: dfs bfs 2015-07-05 22:52 2人阅读 评论(0) 收藏

    Description There is a rectangular room, covered with square tiles. Each tile is colored either red ...

  5. shell脚本书写总结

    1.shell脚本,如果重定向到文件中,则在脚本中不可以sed -i,如果用了sed -i ,则自打用了sed -i之后的打印都不能再重定向到输出文件了. 2.shell脚本中,如果将命令写在字符串里 ...

  6. JDK5新特性之线程同步集合(五)

    一. 传统集合: 传统方式下的Collection在迭代集合时, 不同意对集合进行改动: public class CollectionModifyExceptionTest { public sta ...

  7. 自定义视图控制器切换(iOS)

    在iOS开发过程中,通常我们会使用UINavigationController,UITabbarController等苹果提供的视图控制器来切换我们的视图.在iOS5之前,如果要自定义容器视图控制器很 ...

  8. Oracle SQL函数之数学函数

    Oracle SQL函数之数学函数 ABS(x) [功能]返回x的绝对值 [参数]x,数字型表达式 [返回]数字 SQL> SELECT ABS(),ABS(-) FROM DUAL; ABS( ...

  9. nginx : TCP代理和负载均衡的stream模块

    一直以来,Nginx 并不支持tcp协议,所以后台的一些基于TCP的业务就只能通过其他高可用负载软件来完成了,比如Haproxy. 这算是一个nginx比较明显的缺憾.不过,在1.90发布后这个认知将 ...

  10. C#关于ref的用法(多个实参值的传递)

    按照C#默认的按值调用参数的传递机制,不能刻编写出一个方法来实现两个int类型的值交换,因为一个方法只能对应一个返回值,如何实现将两个交换的值传递回去,这里我将用到的是ref修饰符. 使用ref的单值 ...