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)

相关推荐

  • Android编程实现动态更新ListView的方法

    本文实例讲述了Android编程实现动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView.从今天起,每次学习的源代码都会打包上传,方便各位同学学习,注册帐号即可下载. 布局main.xml: <?xml

  • Android开发中Listview动态加载数据的方法示例

    本文实例讲述了Android开发中Listview动态加载数据的方法.分享给大家供大家参考,具体如下: 最近在研究网络数据加载的问题,比如我有几百,甚至上千条数据,这些数据如果一次性全部加载到arraylist,然后再加载到Listview中.我们必然会去单独开线程来做,这样造成的结果就是会出现等待时间很长,用户体验非常不好.我的想法是动态加载数据,第一次加载十条,然后往下面滑动的时候再追加十条,再往下面滑动的时候再去追加,这样大大减少了用户等待的时间,同时给处理数据留下了时间.网上看到了这样一

  • Android ListView中动态显示和隐藏Header&Footer的方法

    ListView的模板写法 ListView模板写法的完整代码: •android代码优化----ListView中自定义adapter的封装(ListView的模板写法) 以后每写一个ListView,就这么做:直接导入ViewHolder.java和ListViewAdapter,然后写一个自定义adapter继承自ListViewAdapter就行了. ListView中动态显示和隐藏Header&Footer 如果需要动态的显示和隐藏footer的话,按照惯例,误以为直接通过setVis

  • Android实现ListView数据动态加载的方法

    本文实例讲述了Android实现ListView数据动态加载的方法.分享给大家供大家参考,具体如下: list.setOnScrollListener(new OnScrollListener() { //添加滚动条滚到最底部,加载余下的元素 public void onScrollStateChanged(AbsListView view, int scrollState) { // if (scrollState == OnScrollListener.SCROLL_STATE_IDLE)

  • Android实现listview动态加载数据分页的两种方法

    在android开发中,经常需要使用数据分页,比如要实现一个新闻列表的显示,或者博文列表的显示,不可能第一次加载就展示出全部,这就需要使用分页的方法来加载数据,在android中Handler经常用来在耗时的工作中,它接收子线程发送的数据,并使用数据配合更新UI,AsyncTask是在一个线程中执行耗时操作然后把结果传给UI线程,不需要你亲自去管理线程和句柄. 一.使用Handler+线程方法 1.基础知识 Handler在android系统中,主要负责发送和接收消息,它的用途主要有以下两种:

  • Android实现Listview异步加载网络图片并动态更新的方法

    本文实例讲述了Android实现Listview异步加载网络图片并动态更新的方法.分享给大家供大家参考,具体如下: 应用实例:解析后台返回的数据,把每条都显示在ListView中,包括活动图片.店名.活动详情.地址.电话和距离等. 在布局文件中ListView的定义: <ListView android:id="@id/maplistview" android:background="@drawable/bg" android:layout_width=&qu

  • Android开发之利用ListView动态刷新某个Item

    前言 本文实现的是使用ViewHolder来刷新某项数据,而不用每次都全部刷新数据.下面话不多说,来看看详细的介绍. 实现方法 继承BaseAdapter,新建ViewHolder类. public class TestListAdapter extends BaseAdapter { private Context mContext; private List<String> strList; public TestListAdapter(Context context, List<S

  • Android listview动态加载列表项实现代码

    最近了一个动态加载listview类表项的列子,分享出来大家学习学习,说说这个例子的实现过程,首先限定每次加载的列表项数据为10条数据,当拖动listview滚动到最后一条数据的时候再加载10条,并在Listview下方显示加载提示. 下面是我的java源码: private void showContent() { listView = (ListView) findViewById(R.id.journals_list_one); loadData(); adapter = new MyLi

  • android ListView内数据的动态添加与删除实例代码

    main.xml 文件: 复制代码 代码如下: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_pa

  • Android通过Handler与AsyncTask两种方式动态更新ListView(附源码)

    本文实例讲述了Android通过Handler与AsyncTask两种方式动态更新ListView的方法.分享给大家供大家参考,具体如下: 有时候我们需要修改已经生成的列表,添加或者修改数据,notifyDataSetChanged()可以在修改适配器绑定的数组后,不用重新刷新Activity,通知Activity更新ListView.今天的例子就是通过Handler AsyncTask两种方式来动态更新ListView. 布局main.xml: <?xml version="1.0&qu

  • Android ListView中headerview的动态显示和隐藏的实现方法

    Android ListView中headerview的动态显示和隐藏的实现方法 1.动态设置headerview的方法 动态设置headerview有两个思路. 方法一 将header的布局写在list item的布局文件中,在adapter中通过判断position的值是否为0动态控制其显示或隐藏. 代码示例: item.xml布局文件 <?xml version="1.0" encoding="utf-8"?> <LinearLayout x

随机推荐