4.TableLayout、回调接口


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical" >
<!-- android:shrinkColumns="0" 压缩第0列,当第0列的内容过多时,不至于将其他列的内容,挤出屏幕 -->
<TableLayout
android:id="@+id/tl_receive"
android:layout_width="match_parent"
android:shrinkColumns="0"
android:layout_height="wrap_content" >
<TableRow android:layout_height="wrap_content" >
<TextView
android:id="@+id/tv_msg_receive"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/receive_msg_bubble"
android:text="asdfasdfasdfasdfasdfsdfadfadfasdfasfsdfadffad" />
<TextView
android:id="@+id/tv_date_receive"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="bottom"
android:text="2014/10/10" />
</TableRow>
</TableLayout>
<!-- android:shrinkColumns="1" 压缩第0列,当第0列的内容过多时,不至于将其他列的内容,挤出屏幕 -->
<TableLayout
android:id="@+id/tl_send"
android:layout_width="match_parent"
android:shrinkColumns="1"
android:layout_height="wrap_content" >
<TableRow android:layout_height="wrap_content"
android:gravity="right">
<TextView
android:id="@+id/tv_date_send"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="bottom"
android:text="2014/10/10" />
<TextView
android:id="@+id/tv_msg_send"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:background="@drawable/send_msg_bubble"
android:text="sfsdfadadsadsfasdfadfffad" />
</TableRow>
</TableLayout>
<!-- 另一种实现 方式 -->
<!-- <LinearLayout
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="right"
>
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
>
<TextView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:gravity="bottom"
android:text="2014/10/10" />
<TextView
android:layout_width="0dp"
android:layout_height="wrap_content"
android:layout_weight="2"
android:background="@drawable/send_msg_bubble"
android:text="asdfdf" />
</LinearLayout>
</LinearLayout> -->
</LinearLayout>
public class ConversationDetail extends Activity implements OnClickListener{
/**
*联系人的电话号码
*/
private String address;
private Context ctx;
private ListView listView;
private EditText inputMsg;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ctx = this;
address = getIntent().getStringExtra("address");
if(address == null){
throw new RuntimeException("联系人是空,我不知道显示哪个会话记录");
}
setContentView(R.layout.activity_conversation_detail);
init();
listView = (ListView) findViewById(R.id.lv_conversation_detail);
adapter = new MyListAdapter(this, null);
listView.setAdapter(adapter);
//设置listView条目之间的分隔线为null ,即,不要分隔线
listView.setDivider(null);
prepareData();
}
private void prepareData() {
MyQueryHandler
public class MyQueryHandler extends AsyncQueryHandler{
public MyQueryHandler(ContentResolver cr) {
super(cr);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
System.out.println("onQueryComplete : token:"+token);
System.out.println("onQueryComplete : cookie:"+cookie);
Tools.printCursor(cursor);
if(cookie!=null && cookie instanceof CursorAdapter){
CursorAdapter adapter = (CursorAdapter) cookie;
// 给adapter 设置新的cursor
adapter.changeCursor(cursor);
}
if(cursorChangedListener!=null){
cursorChangedListener.onCursorChanged(token, cookie, cursor);
}
}
public IOnCursorChangedListener getCursorChangedListener() {
return cursorChangedListener;
}
public void setOnCursorChangedListener(IOnCursorChangedListener cursorChangedListener) {
this.cursorChangedListener = cursorChangedListener;
}
private IOnCursorChangedListener cursorChangedListener;
/**
* 声明,cursor改变时的监听接口
* @author Administrator
*
*/
public interface IOnCursorChangedListener{
void onCursorChanged(int token, Object cookie, Cursor cursor);
}
}
//回调接口写法:这样就把adapter有回传回来了MyQueryHandler myQueryHandler = new MyQueryHandler(getContentResolver());
myQueryHandler.setOnCursorChangedListener(new MyQueryHandler.IOnCursorChangedListener() {
@Override
/**
* 当adapter 获得 cursor 的时候,回调此方法
*/
public void onCursorChanged(int token, Object cookie, Cursor cursor) {
// 让listview 显示最后一行
listView.setSelection(adapter.getCount()-1);
}
});
myQueryHandler.startQuery(99, adapter, MyConstants.URI_SMS, projection, " address="+address, null, " date ");
}
/**
* 显示会话详情,所需要的列
*/
private String[] projection={
"_id","body","date","type"
};
/**
* 短信内容所在列的索引值 为 1
*/
private final int INDEX_BODY = 1;
private final int INDEX_DATE = 2;
private final int INDEX_TYPE = 3;
private void init() {
TextView title = (TextView) findViewById(R.id.tv_title_conversation_detail);
String name = Tools.findNameByNumber(ctx, address);
if(name !=null){ // 有此联系人
title.setText(name);
}else{ // 无此联系人
title.setText(address);
}
findViewById(R.id.btn_back).setOnClickListener(this);
findViewById(R.id.btn_ok).setOnClickListener(this);
inputMsg = (EditText) findViewById(R.id.et_input_msg_conversation_detail);
}
@Override
/**
* 响应按钮的点击事件
*/
public void onClick(View v) {
switch (v.getId()) {
case R.id.btn_back: // 后退按钮
finish();
break;
case R.id.btn_ok: // 确定按钮
//先判断输入的是否有内容,
//如果有内容的话,就将内容以短信的形式发送出去,
String msg = inputMsg.getText().toString();
if(TextUtils.isEmpty(msg.trim())){
Toast.makeText(ctx, "请输入短信内容", 0).show();
return ;
}
// 发送短信
Tools.sendMessage(ctx,msg,address);
//清空输入框
inputMsg.setText("");
// 隐藏输入法键盘
InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE);
// 隐藏输入法的 API
imm.toggleSoftInput(0, InputMethodManager.HIDE_NOT_ALWAYS);
break;
}
}
private MyListAdapter adapter;
private class MyListAdapter extends CursorAdapter{
public MyListAdapter(Context context, Cursor c) {
super(context, c);
}
@Override
/**
* 当内容发生改变的时候,回调此方法
*/
protected void onContentChanged() {
// super 里面,做了重新查询的动作
super.onContentChanged();
// 让listView 显示最后一行
listView.setSelection(getCount()-1);
}
@Override
public View newView(Context context, Cursor cursor, ViewGroup parent) {
View view =View.inflate(ctx, R.layout.list_item_conversation_detail, null);
ViewHolder vh = new ViewHolder();
vh.tlReceive = (TableLayout) view.findViewById(R.id.tl_receive);
vh.msgReceive = (TextView) view.findViewById(R.id.tv_msg_receive);
vh.dateReceive = (TextView) view.findViewById(R.id.tv_date_receive);
vh.tlSend = (TableLayout) view.findViewById(R.id.tl_send);
vh.msgSend = (TextView) view.findViewById(R.id.tv_msg_send);
vh.dateSend = (TextView) view.findViewById(R.id.tv_date_send);
view.setTag(vh);
return view;
}
@Override
public void bindView(View view, Context context, Cursor cursor) {
ViewHolder vh = (ViewHolder) view.getTag();
// 给listView条目设置内容
int type = cursor.getInt(INDEX_TYPE);// 获得短信类型
String text = cursor.getString(INDEX_BODY);//获得短信内容
long when = cursor.getLong(INDEX_DATE);// 获得日期
String dateStr = DateFormat.getDateFormat(ctx).format(when);
if(type == MyConstants.TYPE_RECEIVE){ // 接收到的短信
vh.tlReceive.setVisibility(View.VISIBLE);
vh.tlSend.setVisibility(View.GONE);
//设置短信内容
vh.msgReceive.setText(text);
//设置日期
vh.dateReceive.setText(dateStr);
}else{
vh.tlReceive.setVisibility(View.GONE);
vh.tlSend.setVisibility(View.VISIBLE);
//设置短信内容
vh.msgSend.setText(text);
vh.dateSend.setText(dateStr);
}
}
}
private class ViewHolder {
public TableLayout tlReceive;
public TextView msgReceive;
public TextView dateReceive;
public TableLayout tlSend;
public TextView msgSend;
public TextView dateSend;
}
}
4.TableLayout、回调接口的更多相关文章
- Android回调接口的写法
方法一: 定义一个接口,里面写想要对外提供的方法,在逻辑层方法的参数里传递进去,让在需要的时候调接口里的方法. 实例一: public class SmsUtils { public interfac ...
- Android中回调接口的使用
MainActivity如下: package cn.testcallback; import android.os.Bundle; import android.app.Activity; /** ...
- 手势识别官方教程(2)识别常见手势用GestureDetector+手势回调接口/手势抽象类
简介 GestureDetector识别手势. GestureDetector.OnGestureListener是识别手势后的回调接口.GestureDetector.SimpleOnGesture ...
- 使用回调接口实现ActiveX控件和它的容器程序的通讯
本文阅读基础:有一定的C++基础知识(了解继承.回调函数),对MFC的消息机制有一定了解,对COM的基础知识有一定了解,对ActiveX控件有一定了解. 一. 前言 ActiveX控件和它的容器程序如 ...
- 【Android 应用开发】 自定义组件 宽高适配方法, 手势监听器操作组件, 回调接口维护策略, 绘制方法分析 -- 基于 WheelView 组件分析自定义组件
博客地址 : http://blog.csdn.net/shulianghan/article/details/41520569 代码下载 : -- GitHub : https://github.c ...
- Spring Boot启动过程及回调接口汇总
Spring Boot启动过程及回调接口汇总 链接: https://www.itcodemonkey.com/article/1431.html 来自:chanjarster (Daniel Qia ...
- C#POST 支付宝/微信回调接口
一般支付宝/微信的回调接口都会返回xml格式,下面是调用类似这种接口的办法: public async Task<string> GetData() { string requestUrl ...
- vue回调接口
1.微博回调接口 1.1oauth/urls.py 中添加路由 urlpatterns = [ path('weibo/callback/', views.OauthWeiboCallback.as_ ...
- Android中添加监听回调接口的方法
在Android中,我们经常会添加一些监听回调的接口供别的类来回调,比如自定义一个PopupWindow,需要让new这个PopupWindow的Activity来监听PopupWindow中的一些组 ...
随机推荐
- .net core中的分布式缓存和负载均衡
通过减少生成内容所需的工作,缓存可以显著提高应用的性能和可伸缩性,缓存对不经常更改的数据效果最佳,缓存生成的数据副本的返回速度可以比从原始源返回更快.ASP.NET Core 支持多种不同的缓存,最简 ...
- 检查手机是否安装外置SD卡
/** * 检测是否安装外置SD卡 * * @return */ public boolean checkSDcard() { StorageList list = new StorageList(t ...
- windows server 2016安装
slmgr /skms kms.03k.org slmgr /ato slmgr /ipk WC2BQ-8NRM3-FDDYY-2BFGV-KHKQY kms服务器: https://03k.org/ ...
- asp.net上传图片到服务器
ASP.NET的FileUpload控件可用于上传文件到服务器.HoverTreeTop新增了一个“阅图”功能,图片就是用FileUpload上传的.阅图功能查看:http://hovertree.c ...
- token回话保持,axios请求拦截和导航守卫以及token过期处理
1:了解token:有时候大家又说token令牌.整个机制是前端第一次登陆发送请求,后端会根据前端的用户名和密码, 通过一些列的算法的到一个token令牌, 这个令牌是独一无二的,前端每次发送请求都需 ...
- 20170529计划---统计业务量并生成EXCEL通过邮件发送
每个月都要统计这些业务量的东东,烦死了,赶紧通过python写一个来搞定吧,三天搞定吧,未完待续哈. 2017-5-29 19:50粗略地做了一个思维导图哈 终于第三天完成啦 #encoding=ut ...
- Numpy 数组属性
Numpy 数组的维数称为秩(rank),一维数组的秩为 1 , 二维数组的秩为 2 , 以此类推:在Numpy中, 每一个线性的数组称为是一个轴(axis),也就是维度(dimensios).比如说 ...
- JSP 页面跳转的实现方法
客户端跳转 1. 使用 href 超链接标记 <a href="new.jsp">跳转</a> 2. 使用表单提交完成跳转 <form actio ...
- godoc
Godoc-一个Go代码文档化工具 Python - Docstring Java - javadoc
- SGD训练时收敛速度的变化研究。
一个典型的SGD过程中,一个epoch内的一批样本的平均梯度与梯度方差,在下图中得到了展示. 无论什么样的网络结构,无论是哪一层网络的梯度,大体上都遵循下面这样的规律: 高信号/噪音比一段时间之后,信 ...