4.TableLayout、回调接口
时间:2022-05-14
本文章向大家介绍4.TableLayout、回调接口,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
会话详情页
listview条目布局
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;
}
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 一天一大 leet(恢复空格)难度:中等-Day20200709
- 一天一大 leet(旋转数组的最小数字)难度:简单-Day20200721
- 一天一大 leet(最佳买卖股票时机含冷冻期)难度:中等-Day20200710
- 一天一大 leet(戳气球)难度:困难-Day20200719
- 一天一大 leet(不同的二叉搜索树 II)难度:中等-Day20200721
- 组合游戏系列5: 井字棋、五子棋AlphaGo Zero 算法实战
- 一天一大 leet(最小路径和)难度:中等-Day20200723
- 一天一大 leet(二叉树的最大深度)难度:简单-Day20200728
- 生产者消费者模式的三种实现方式
- java中的阻塞队列
- java虚拟机
- 重构:保持Dockerfile整洁的5个技巧
- spring boot启动过程
- 如何构造jvm的堆溢出和栈溢出
- 一日一技:导入父文件夹中的模块并读取当前文件夹内的资源