android动态布局之动态加入TextView和ListView的方法
作者:jayqean 发布时间:2022-11-25 11:28:16
标签:android,动态布局,TextView,ListView
本文实例讲述了android动态布局之动态加入TextView和ListView的方法。分享给大家供大家参考。具体实现方法如下:
package org.guoshi;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.guoshi.adapter.ImageAndTextAdapter;
import android.app.Activity;
import android.graphics.Color;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup.LayoutParams;
import android.widget.LinearLayout;
import android.widget.ListAdapter;
import android.widget.ListView;
import android.widget.RelativeLayout;
import android.widget.TextView;
public class Main extends Activity {
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.friend_info_view);
final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.groups);
final ListView lv = new ListView(this);
List<Map<String, Object>> data = new ArrayList<Map<String, Object>>();
Map<String, Object> map = new HashMap<String, Object>();
map.put("title", "jayqean");
map.put("imgsrc", R.drawable.icon);
data.add(map);
ListAdapter adapter = new ImageAndTextAdapter(Main.this, data, R.layout.chats_view_item, new String[] { "title", "imgsrc" }, new int[] {
R.id.chats_view_name,
R.id.chats_view_item_image });
lv.setAdapter(adapter);
final TextView tv1 = new TextView(this);
tv1.setText("常用联系人");
tv1.setId(1);
final RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
lp1.addRule(RelativeLayout.BELOW, R.id.groups);
tv1.setLayoutParams(lp1);
tv1.setBackgroundColor(R.color.group_view_background);
tv1.setOnClickListener(new OnClickListener() {
boolean flag = false;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("tag", tv1.getText().toString());
if(!flag){
linearLayout.addView(lv, linearLayout.indexOfChild(tv1) + 1);
// lp1.addRule(RelativeLayout.BELOW, 1);
// linearLayout.addView(lv, lp1);
flag = true;
} else{
linearLayout.removeView(lv);
flag = false;
}
}
});
linearLayout.addView(tv1, lp1);
// 线性布局 通过参数index控制加入的控件的位置
// ------------------------
// 加入分割线
final TextView line = new TextView(this);
line.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, 1));
line.setBackgroundColor(Color.WHITE);
linearLayout.addView(line, 1);
// ------------------------
final ListView lv2 = new ListView(this);
List<Map<String, Object>> data2 = new ArrayList<Map<String, Object>>();
Map<String, Object> map2 = new HashMap<String, Object>();
map2.put("title", "xiaobei");
map2.put("imgsrc", R.drawable.icon);
data2.add(map2);
ListAdapter adapter2 = new ImageAndTextAdapter(Main.this, data2, R.layout.chats_view_item, new String[] { "title", "imgsrc" }, new int[] {
R.id.chats_view_name,
R.id.chats_view_item_image });
lv2.setAdapter(adapter2);
final TextView tv2 = new TextView(this);
tv2.setText("离线好友");
tv2.setLayoutParams(new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT));
tv2.setBackgroundColor(R.color.group_view_background);
tv2.setOnClickListener(new OnClickListener() {
boolean flag = false;
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
Log.d("tag", tv2.getText().toString());
if(!flag){
linearLayout.addView(lv2, linearLayout.indexOfChild(tv2) + 1);
flag = true;
} else{
linearLayout.removeView(lv2);
flag = false;
}
}
});
linearLayout.addView(tv2, 2);
}
}
控制布局,可以通过RelativeLayout.LayoutParams类
final LinearLayout linearLayout = (LinearLayout) findViewById(R.id.groups);
final TextView tv1 = new TextView(this);
tv1.setText("常用联系人");
RelativeLayout.LayoutParams lp1 = new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.WRAP_CONTENT);
lp1.addRule(RelativeLayout.BELOW, R.id.groups);
tv1.setLayoutParams(lp1);
linearLayout.addView(tv1, lp1);
也可采用linearLayout.addView(tv1, 0); // 线性布局 通过参数index控制加入的控件的位置
package org.guoshi.adapter;
import java.util.List;
import java.util.Map;
import android.content.Context;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.View.OnClickListener;
import android.view.ViewGroup;
import android.widget.Checkable;
import android.widget.ImageView;
import android.widget.SimpleAdapter;
import android.widget.TextView;
public class ImageAndTextAdapter extends SimpleAdapter {
private Context mcontext;
private int[] mTo;
private String[] mFrom;
private ViewBinder mViewBinder;
private List<? extends Map<String, ?>> mData;
private int mResource;
private LayoutInflater mInflater;
public ImageAndTextAdapter(Context context,
List<? extends Map<String, ?>> data, int resource, String[] from,
int[] to) {
super(context, data, resource, from, to);
mcontext = context;
mData = data;
mResource = resource;
mFrom = from;
mTo = to;
mInflater = (LayoutInflater) context
.getSystemService(Context.LAYOUT_INFLATER_SERVICE);
// mInflater = LayoutInflater.from(mcontext);
}
/**
* @see android.widget.Adapter#getView(int, View, ViewGroup)
*/
public View getView(int position, View convertView, ViewGroup parent) {
return createViewFromResource(position, convertView, parent, mResource);
}
private View createViewFromResource(int position, View convertView,
ViewGroup parent, int resource) {
View v;
if (convertView == null) {
v = mInflater.inflate(resource, parent, false);
final int[] to = mTo;
final int count = to.length;
final View[] holder = new View[count];
for (int i = 0; i < count; i++) {
holder[i] = v.findViewById(to[i]);
}
v.setTag(holder);
} else {
v = convertView;
}
bindView(position, v);
// final int index = position;
// v.setOnClickListener(new OnClickListener() {
//
// public void onClick(View v) {
// // TODO Auto-generated method stub
// Log.d("item", index + "");
// }
// });
return v;
}
private void bindView(int position, View view) {
final Map<String, ?> dataSet = mData.get(position);
if (dataSet == null) {
return;
}
final ViewBinder binder = mViewBinder;
final View[] holder = (View[]) view.getTag();
final String[] from = mFrom;
final int[] to = mTo;
final int count = to.length;
for (int i = 0; i < count; i++) {
final View v = holder[i];
if (v != null) {
final Object data = dataSet.get(from[i]);
String text = data == null ? "" : data.toString();
if (text == null) {
text = "";
}
boolean bound = false;
if (binder != null) {
bound = binder.setViewValue(v, data, text);
}
if (!bound) {
if (v instanceof Checkable) {
if (data instanceof Boolean) {
((Checkable) v).setChecked((Boolean) data);
} else {
throw new IllegalStateException(v.getClass()
.getName()
+ " should be bound to a Boolean, not a "
+ data.getClass());
}
} else if (v instanceof TextView) {
setViewText((TextView) v, text);
} else if (v instanceof ImageView) {
if (data instanceof Integer) {
setViewImage((ImageView) v, (Integer) data);
} else {
setViewImage((ImageView) v, text);
}
} else {
throw new IllegalStateException(
v.getClass().getName()
+ " is not a "
+ " view that can be bounds by this SimpleAdapter");
}
}
}
}
}
/**
* Called by bindView() to set the image for an ImageView but only if there
* is no existing ViewBinder or if the existing ViewBinder cannot handle
* binding to an ImageView.
*
* This method is called instead of {@link #setViewImage(ImageView, String)}
* if the supplied data is an int or Integer.
*
* @param v
* ImageView to receive an image
* @param value
* the value retrieved from the data set
*
* @see #setViewImage(ImageView, String)
*/
public void setViewImage(ImageView v, int value) {
v.setImageResource(value);
}
/**
* Called by bindView() to set the image for an ImageView but only if there
* is no existing ViewBinder or if the existing ViewBinder cannot handle
* binding to an ImageView.
*
* By default, the value will be treated as an image resource. If the value
* cannot be used as an image resource, the value is used as an image Uri.
*
* This method is called instead of {@link #setViewImage(ImageView, int)} if
* the supplied data is not an int or Integer.
*
* @param v
* ImageView to receive an image
* @param value
* the value retrieved from the data set
*
* @see #setViewImage(ImageView, int)
*/
public void setViewImage(ImageView v, String value) {
Bitmap bitMap = BitmapFactory.decodeFile(value);
v.setImageBitmap(bitMap);
}
}
下面是friend_info_view.xml
<?xml version="1.0" encoding="UTF-8"?>
<!-- 好友信息列表.xml -->
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="#ffffff">
<RelativeLayout android:layout_width="wrap_content"
android:layout_height="wrap_content">
<ImageView android:id="@+id/selfImage"
android:adjustViewBounds="true" android:layout_width="@dimen/self_image_width"
android:layout_height="@dimen/self_image_height"
android:layout_marginLeft="5.0dip" android:layout_marginBottom="10.0dip"
android:layout_marginTop="3.0dip" android:src="@drawable/default_image" />
<ImageView android:id="@+id/currentStatus"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:src="@drawable/status_available" android:layout_marginLeft="8.0dip"
android:layout_marginTop="20.0dip" android:layout_toRightOf="@id/selfImage" />
<TextView android:id="@+id/setStatus" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:layout_marginTop="20.0dip"
android:layout_marginLeft="8.0dip" android:text="Tap here to set your status"
android:layout_toRightOf="@+id/currentStatus" />
</RelativeLayout>
<EditText android:id="@+id/searchFriend"
android:adjustViewBounds="true" android:layout_height="50dip"
android:layout_width="fill_parent" android:text="Search..." />
<!-- 好友组 点击textview后出现组里的详细好友列表 -->
<LinearLayout android:id="@+id/groups" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:orientation="vertical" >
</LinearLayout>
</LinearLayout>
chats_view_item.xml
<?xml version="1.0" encoding="UTF-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical" android:layout_width="fill_parent"
android:layout_height="fill_parent" android:background="@color/white">
<RelativeLayout android:id="@+id/chats_view_item"
android:layout_width="wrap_content" android:layout_height="wrap_content">
<ImageView android:id="@+id/chats_view_item_image"
android:layout_width="@dimen/friend_image_width"
android:layout_height="@dimen/friend_image_height"
android:paddingLeft="5.0dip" android:paddingTop="2.0dip"
android:src="@drawable/default_image" />
<TextView android:id="@+id/chats_view_name" android:textSize="14.0sp"
android:paddingLeft="10.0dip" android:textStyle="bold"
android:ellipsize="marquee" android:layout_width="wrap_content"
android:layout_height="wrap_content" android:text="username"
android:singleLine="true" android:paddingTop="2.0dip"
android:layout_toRightOf="@+id/chats_view_item_image" />
<ImageView android:id="@+id/friend_status_icon"
android:layout_width="wrap_content" android:layout_height="wrap_content"
android:paddingLeft="10.0dip" android:paddingTop="1.0dip"
android:layout_below="@+id/chats_view_name" android:layout_toRightOf="@+id/chats_view_item_image"
android:src="@drawable/jabber_available" />
<TextView android:id="@+id/chats_view_status"
android:textColor="@android:color/secondary_text_light"
android:ellipsize="marquee" android:layout_width="fill_parent"
android:layout_height="wrap_content" android:text="available"
android:singleLine="true" android:paddingLeft="2.0dip"
android:layout_toRightOf="@+id/friend_status_icon"
android:layout_below="@+id/chats_view_name" />
</RelativeLayout>
</LinearLayout>
效果图如下:
希望本文所述对大家的Android程序设计有所帮助。
0
投稿
猜你喜欢
- 最近自己写了个小爬虫,里面用到了多线程技术,忽然发现对此技术竟然有些陌生了,于是乎开始疯狂的去问度娘,在此记录下来,以便自己和各位小伙伴们学
- 本文实例为大家分享了Java使用单链表实现约瑟夫环的具体代码,供大家参考,具体内容如下构建一个单向的环形链表思路1.先创建第一个节点, 让f
- 本文介绍通过Java程序批量替换PDF中的指定文本内容。程序环境准备如下:程序使用环境如图,需要注意的是,本文使用了免费版的PDF jar工
- 最近发现线上监控有个SQL调用量很大,但是方法的调用量不是很大,查看接口实现,发现接口是做了缓存操作的,使用Spring cache缓存注解
- JPA是什么? JPA(Java Persistence API)是Sun官方提出的Java持久化规范. 为Java开发人员提供了一种对象/
- @JsonFormat处理LocalDateTime失效Failed to convert property value of type &
- 近来,很多公司的APP都实现了人脸识别登录的功能。今天呢,银鹏带大家从头到尾做一下这个人脸识别登录。首先呢,我们需要采用一个拥有人脸识别算法
- 本次主要分享的是3个免费的二维码接口的对接代码和测试得出的注意点及区别,有更好处理方式多多交流,相互促进进步;最近在学习JavsScript
- 上了这么多年学,我发现一个问题,好象老师都很喜欢点名,甚至点名都成了某些老师的嗜好,一日不点名,就饭吃不香,觉睡不好似的,我就觉得很奇怪,你
- 本文实例讲述了C#编程获取资源文件中图片的方法。分享给大家供大家参考。具体实现方法如下:using System;using System.
- C#接口的学习,在编程中,我们经常会用到接口,那什么是接口呢?接口描述的是可属于任何类或结构的一组相关功能,所以实现接口的类或结构必须实现接
- 一、图示二、MapStructpom文件 <dependency> &n
- 要说this和super就不得不说Java的封装和继承了,首先说封装,这是一种思想,算不上一种技术,核心思想就是将对象的同一行为和状态看成是
- 本文实例讲述了C#中动态数组用法。分享给大家供大家参考。具体分析如下:ArrayList是一种动态数组,其容量可随着我们的需要自动进行扩充.
- 出错信息:Unknown error (0xffffffff)at System.Diagnostics.Process.StartWith
- C#编程语言非常优美,我个人还是非常赞同的。特别是在学习一段时间C#后发现确实在它的语法和美观度来说确实要比其它编程语言强一些(也可能是由于
- 最近,Oracle 宣布 Java 14(或 Oracle JDK 14)公开可用。如果你想进行最新的实验或者开发的话,那么你可以试试在 L
- Java内存分配与管理是Java的核心技术之一,之前我们曾介绍过Java的内存管理与内存泄露以及Java垃圾回收方面的知识,今天我们再次深入
- 本文实例讲述了C# Winform实现捕获窗体最小化、最大化、关闭按钮事件的方法,主要是通过重写WndProc来实现的。分享给大家供大家参考
- 前言数独是一种有趣的智力游戏,但是部分高难度数独在求解过程中经常出现大量单元格有多个候选数字可以填入,不得不尝试填写某个数字然后继续推导的方