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中的一些组 ...
随机推荐
- Mac 怎么通过自带终端连接linux服务器
简单来说,就两步骤 · 打开Mac终端,切换到root权限下 切换root权限: sudo -i ·通过ssh命令连接linux服务器 ssh root@127.0.0.1 root是账户名,@后面的 ...
- VBA 生成XML(转)
需要引用连个库,Microsoft ADO Ext. 6.0 for DDL and Security, Miscrosoft ActiveX Data Objects 2.7 Library . ...
- 基于stm32f427实现SVPWM控制永磁同步开环转动
1.SVPWM原理简介 PWM(Pulse Width Modulation)脉宽调整,这是一种利用面积等效原理实现的控制技术.SVPWM(Space Vector PWM)空间矢量PWM控制,因为控 ...
- 移值UCOS2到M4核与M3核的区别
之前移值过ucos2到stm32f2系列的单片机,这个单片机是属于arm的m3内核的.最近在学习永磁同步电机的控制,对于这个电机的控制,有比较多的数学计算,甚至于还有浮点的运算.所以用到了stm32f ...
- Synchronized和Lock的区别
①synchronized是jvm的关键字,Lock是Java类: ②synchronized会自动释放锁,而Lock需要在finally语句中主动释放锁,否则会造成死锁 ③用synchronized ...
- java 日志体系目录
java 日志体系目录 1.1 java 日志体系(一)log4j1.log4j2.logback.jul.jcl.slf4j 1.2 java 日志体系(二)jcl 和 slf4j 2.1 java ...
- 开发快平台(M302I小e开发板系列教程)
开发快平台(M302I小e开发板系列教程) 开发块平台ESP8266模块相关理解 一. M302I小e开发板源码注释,源码基于:v1.4.0.8-u34.zip 1. user_main.c /*** ...
- Java--druidAPI查询
maven依赖<dependency> <groupId>in.zapr.druid</groupId> <artifactId>druidry< ...
- JavaScript变量声明var,let.const
var声明变量的作用域限制在其声明位置的上下文中 var x = 0; // x是全局变量,并且赋值为0. console.log(typeof z); // undefined,因为z还不存在. f ...
- https多网站1个IP多个SSL证书的Apache设置办法
这些天接触了解SSL证书后,写了一篇<申请免费的SSL证书,开通https网站>博文,其中简单记录了Apache的设置,后来又涉及到多个域名.泛域名解析.通配符SSL证书.单服务器/多服务 ...