listview以前有了解和学习过一些,但是认识都不是很深刻,或者只是在抄别人的做法来勉强实现自己的要求。
这次借着此机会刚好可以深入了解一下listview的用法。

listview生成布局可以通过xml或者代码动态生成布局。
所涉及的事情需要使用listview需要去显示wifi列表和信号强度,但之前的布局是基于代码生成的所有布局,没办法使用xml来完成功能,只能硬着头皮去做listview的动态布局的实现。

简单的用法:
之前有过一些笔记,拿过来先看看,这个是从别的地方摘抄过来的,如有违规,请单独知会我一下。
listview如果每行都需要显示一行字,用法如下:
ArrayAdapter(Context context, int textViewResourceId, List objects)来装配数据,要装配这些数据就需要一个连接ListView视图对象和数组数据的适配器来两者的适配工作,ArrayAdapter的构造需要三个参数,依次为this,布局文件(注意这里的布局文件描述的是列表的每一行的布局,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字,数据源(一个List集合)。同时用setAdapter()完成适配的最后工作。
理解:其实就是一个接口函数,将来源于数据库的数据通过适配器显示在ListView上。
使用时关键代码
public class MyListView extends Activity {

private ListView listView;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    listView = new ListView(this);
    listView.setAdapter(new ArrayAdapter<String>(this, android.R.layout.simple_expandable_list_item_1,getData()));
    setContentView(listView);    
    }


private List<String> getData(){

    List<String> data = new ArrayList<String>();
    data.add("测试数据1");
    data.add("测试数据2");
    data.add("测试数据3");
    data.add("测试数据4");

    return data;

}

android 动态按钮排列_android

listview做文章主要在
public void setAdapter(ListAdapter adapter)这个接口上,
转载参考下面这篇文章,非常详细

这几种Adapter中BaseAdapter可以满足我们的需要,
网上没有好的文档,找到一篇比较有启发的文章链接如下:
Android中动态更新ListView(转)

是listview的item中动态创建textview返回。

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import android.content.Context;
import android.graphics.Color;
import android.util.Log;
import android.view.View;
import android.view.ViewGroup;
import android.view.ViewGroup.LayoutParams;
import android.widget.AbsListView;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;



public class WifiTestListviewAdapter extends BaseAdapter{

    private List<HashMap<String, Object>> mList = new ArrayList<HashMap<String,Object>>();
    private Context mContext;
    public static final String TAG = "zws";

    private static int imageRes[] = {R.drawable.wifi_icon_rssi_0, R.drawable.wifi_icon_rssi_1,
        R.drawable.wifi_icon_rssi_2, R.drawable.wifi_icon_rssi_3};

    public WifiTestListviewAdapter(Context context, List<HashMap<String, Object>> list) {
        // TODO Auto-generated constructor stub
        Log.d(TAG, "WifiTestListviewAdapter constructer");
        mContext = context;
        mList = list;
    }

    @Override
    public int getCount() {
        // TODO Auto-generated method stub
        Log.d(TAG, "list size =" + mList.size());
        return mList.size();
    }

    @Override
    public Object getItem(int position) {
        // TODO Auto-generated method stub
        return mList.get(position);
    }

    @Override
    public long getItemId(int position) {
        // TODO Auto-generated method stub
        return position;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // TODO Auto-generated method stub
        String ssid = mList.get(position).get(WifiTestInfoView.WIFI_SSID).toString();
        Integer level = Integer.valueOf(mList.get(position).get(WifiTestInfoView.WIFI_LEVEL).toString(), 16);

        Log.d(TAG, "#getView# [" + position + "] ssid=" + ssid + " level = " + level);

        LinearLayout itemLayout = (LinearLayout)convertView;
        ViewHolder holder = null;
        //动态创建Layout將TextView/Imageview添加ListView中
        Log.d(TAG, "create itemLayout");
        itemLayout = new LinearLayout(mContext);
        itemLayout.setLayoutParams(new AbsListView.LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.WRAP_CONTENT));
        itemLayout.setOrientation(LinearLayout.HORIZONTAL);

        holder = new ViewHolder();
        holder.leftMargin = new TextView(mContext);
        AbsListView.LayoutParams layoutParams = new AbsListView.LayoutParams(50, LayoutParams.WRAP_CONTENT);
        holder.leftMargin.setLayoutParams(layoutParams);

        holder.ssidName = new TextView(mContext);
        holder.ssidName.setTextAppearance(mContext, android.R.style.TextAppearance_Large);
        AbsListView.LayoutParams layoutParams1 = new AbsListView.LayoutParams(560, LayoutParams.WRAP_CONTENT);
        holder.ssidName.setLayoutParams(layoutParams1);
        holder.ssidName.setTextColor(Color.BLACK);
        holder.ssidName.setText(ssid);

        holder.levelImage = new ImageView(mContext);
        AbsListView.LayoutParams layoutParams2 = new AbsListView.LayoutParams(400, LayoutParams.WRAP_CONTENT);
        holder.levelImage.setLayoutParams(layoutParams2);
        holder.levelImage.setImageResource(imageRes[level]);

        itemLayout.addView(holder.leftMargin);
        itemLayout.addView(holder.ssidName);
        itemLayout.addView(holder.levelImage);

        return itemLayout;
   }

    private class ViewHolder{
        private TextView leftMargin;
        private TextView ssidName;
        private ImageView levelImage;
    }
}

listview的每个item的显示布局是从getView()方法中去获取的,
返回的View类型可以是一个是textview或者imageview这些常用的view,但我需要返回的item项中需要包含一个textview+一张imageview, 这个可以进行组合成一个Layout进行返回,因为layout可以作为一个View来处理。

注意:listview的每个item中布局参数只能用AbsListView.LayoutParams 或者ListView.LayoutParams,不能用LinearLayout参数,运行时提示错误,好像是因为父类不同,类型无法转换造成。

可以正常显示后,发现在显示上有个问题,listview的每个item中的textview和imageview都全部靠左显示,无法指定居中或者调节显示位置。上网查到的结论是:getview()方法中add到layout中的textview和imageview无法按照自己的格式进行布局的控制,只能调整控件的高度和宽度。最后迫不得已增加添加了一个leftMargin的textview来处理左边的距离,其它的自定义添加的view也只能尝试去设置控件宽度、高度到合适的大小,但是不知道在不同的屏幕尺寸上会有问题,需要验证才知。

最后的效果图如下:

android 动态按钮排列_android_02

刚开始学习布局,一些东西还不是特别清楚,只能现学现卖,哈哈~