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列的内容过多时,不至于将其他列的内容,挤出屏幕 --><TableLayoutandroid:id="@+id/tl_receive"android:layout_width="match_parent"android:shrinkColumns="0"android:layout_height="wrap_content" ><TableRow android:layout_height="wrap_content" ><TextViewandroid:id="@+id/tv_msg_receive"android:layout_width="wrap_content"android:layout_height="wrap_content"android:background="@drawable/receive_msg_bubble"android:text="asdfasdfasdfasdfasdfsdfadfadfasdfasfsdfadffad" /><TextViewandroid: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列的内容过多时,不至于将其他列的内容,挤出屏幕 --><TableLayoutandroid: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"><TextViewandroid:id="@+id/tv_date_send"android:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="bottom"android:text="2014/10/10" /><TextViewandroid: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><!-- 另一种实现 方式 --><!-- <LinearLayoutandroid:layout_width="match_parent"android:layout_height="wrap_content"android:gravity="right"><LinearLayoutandroid:layout_width="wrap_content"android:layout_height="wrap_content"><TextViewandroid:layout_width="wrap_content"android:layout_height="match_parent"android:gravity="bottom"android:text="2014/10/10" /><TextViewandroid: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;@Overrideprotected 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);}@Overrideprotected 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 设置新的cursoradapter.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);// 隐藏输入法的 APIimm.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);}@Overridepublic 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;}@Overridepublic 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中的一些组 ...
随机推荐
- Eclipse oxygen 版本汉化教程
Eclipse oxygen 版本汉化步骤如下: 第一步:打开Eclipse 第二步:浏览器打开网址 http://www.eclipse.org/babel/downloads.php 1.复制对应 ...
- angular中如果几个请求相互不依赖,但是请求结果需要一起处理,可以使用
- svg绘制一个简单地饼图
一个简单地svg绘制饼图的demo,代码如下 <!DOCTYPE html> <html> <head> <meta charset="UTF-8& ...
- UI交互设计关键词:情感化设计与心理
情感化设计,一定有一个关键词.情感,是指人对周围事物和自身以及对自己行为的态度,它是人对客观事物的一种特殊的反映形式,是主体对外界刺激给予肯定或否定的心理反应,也是对客观事物是否符合自己需要的态度或体 ...
- mysql 数据库的备份和还原
1. 逻辑备份 (和存储引擎无关) mysqldump -uroot -p schoolDB TSubject > /mysqlbackup/schoolDB.TSubject.sql (备份 ...
- APP优化(转载)
- int main(int argc, char** argv) 以及CommandLineParser
参考链接: 关于int main(int argc, char** argv) http://blog.csdn.net/liuhuiyi/article/details/8239303 http:/ ...
- 关于阿里云ECS服务器修改远程端口的一点总结
般修改公司的远程服务器的登录端口号分为两大步: 一.修改注册表中的两个地方的端口号:(注册表打开命令:regedit) [HKEY_LOCAL_MACHINE\SYSTEM\CurrentContro ...
- django中的modelform和modelfoemset
一. ModelForm ModelForm是根据Model来定制的Form 二. ModelForm的创建 from django import forms from app import mode ...
- 渗透测试的理论部分4——开放式Web应用程序安全项目
开放式Web应用程序安全项目(Open Web Application Security Project OWASP) 定期退出Top 10 project(排名前十的安全隐患防守规则) 公开了编写安 ...