Thursday, August 11, 2011

ListView 浅析

最近着手做一个ANDROID的应用.要用到ListView.看了一些ListView的文章.自己的一些总结: 定义每个ListAdapter中的每一个格(View),的Layout
main.xml
  
<relativelayout android:layout_height="match_parent"
        android:layout_width="match_parent"
        android:orientation="vertical"
        xmlns:android="http://schemas.android.com/apk/res/android">
    <textview android:id="@+id/title" 
        android:layout_alignparenttop="true" 
        android:layout_height="wrap_content" 
        android:layout_torightof="@+id/imageView1" 
        android:layout_width="wrap_content"
        android:text="TextView"></textview>
    <textview android:id="@+id/info"
        android:layout_alignparenttop="true"
        android:layout_height="wrap_content"
        android:layout_marginleft="15dp"
        android:layout_torightof="@+id/title"
        android:layout_width="wrap_content"
        android:text="TextView"></textview>
    <imageview android:id="@+id/imageView1"
        android:layout_alignparentleft="true"
        android:layout_aligntop="@+id/editText1"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:src="@drawable/icon"></imageview>  
    <button android:id="@+id/btnDetail" 
        android:layout_alignbaseline="@+id/editText1" 
        android:layout_alignbottom="@+id/editText1"
        android:layout_alignparentright="true"
        android:layout_height="wrap_content"
        android:layout_width="wrap_content"
        android:text="@string/row_detail"></button>
</relativelayout>
只定义了RelativeLayout等待被ListAdapter使用,有些网上的例子在定义这部分的时候.都设成TableLayout.我认为这里是不需要的.因为这里只是每一个view的内容.
Manifest.xml
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"  
      package="com.ruihui"  
      android:versionCode="1"  
      android:versionName="1.0">
    <uses-sdk android:minSdkVersion="8" />
    <uses-permission android:name="android.permission.INTERNET"></uses-permission>
  
    <application android:icon="@drawable/icon"
        android:label="@string/app_name">
        <activity android:name=".AndUiActivity"  
                  android:label="@string/app_name" 
                  android:configChanges="orientation"
                  android:launchMode="singleInstance">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />
                <category android:name="android.intent.category.LAUNCHER" />  
            </intent-filter>
        </activity>  
    </application>
</manifest> 
接下来是2,定义activity,如下 AndUiActivity.java
package com.sample;  
  
import java.io.IOException;  
import java.io.InputStream;  
import java.util.Date;  
import java.util.List;  
  
import javax.xml.parsers.ParserConfigurationException;  
  
import org.apache.http.HttpEntity;  
import org.apache.http.HttpResponse;  
import org.apache.http.client.ClientProtocolException;  
import org.apache.http.client.HttpClient;  
import org.apache.http.client.methods.HttpGet;  
import org.apache.http.impl.client.DefaultHttpClient;  
import org.xml.sax.SAXException;  
  
import android.app.ListActivity;  
import android.content.Context;  
import android.content.Intent;  
import android.graphics.Color;  
import android.os.Bundle;  
import android.view.LayoutInflater;  
import android.view.View;  
import android.view.View.OnClickListener;  
import android.view.ViewGroup;  
import android.widget.BaseAdapter;  
import android.widget.Button;  
import android.widget.TextView;  
  
import com.ruihui.utils.TextXmlParser;  
  
public class AndUiActivity extends ListActivity {  
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
        super.onCreate(savedInstanceState);  
  
        setListAdapter(new InnerAdapter(this));  
        getListView().setBackgroundResource(R.drawable.android_bg_p);  
    }  
    public static class InnerAdapter extends BaseAdapter{  
        final private LayoutInflater inflater;  
        private DataHolder data;  
        public InnerAdapter(Context ctx){  
            inflater=LayoutInflater.from(ctx);  
            ((ListActivity)ctx).setTitle("ListView example");  
        }  
        @Override  
        public int getCount() {  
            return 10;  
        }  
        @Override  
        public Object getItem(int arg0) {  
            return null;  
        }  
        @Override  
        public long getItemId(int arg0) {  
            return 0;  
        }  
        @Override  
        public View getView(int index, View view, ViewGroup vg) {  
            View vw;  
            if(view == null){  
                vw=inflater.inflate(R.layout.main, null);  
            } else {  
                vw=view;  
            }  
            TextView tv=(TextView) vw.findViewById(R.id.title);  
            tv.setText("code"+index);  
            tv = (TextView) vw.findViewById(R.id.info);  
            tv.setText("info"+index);  
            Button bt=(Button) vw.findViewById(R.id.btnDetail);  
            if(index %2 == 0)  
                vw.setBackgroundColor(Color.rgb(201, 210, 224));  
            else  
                vw.setBackgroundColor(Color.rgb(224, 200, 210));  
            return vw;  
        }  
    }  
}
所有的关键是类InnerAdapter.java中. getCount方法 定义了需要返回的view的数量. getItem和getItemId可以暂时忽略. 主要是getView.使用Inflater获取定义好的main.xml.然后根据index来定义好当前view的内容.在方法 .getView()中返回. 这样就可以最简单的方式定制一个有丰富内容的ListView了.简单解释一下: index 当前的view的索引, view 如果没有创建为 null. 如果有创建则为对象, ViewGroup 本人暂时还不知道是什么.但是不影响现在这个例子. 内部的业务为.把相应的内容填充到view中.然后返回.就可以了.至于怎么在ListView中显示就交由系统完成.

效果图

1 comment:

  1. 大家好,我的名字是福莫萨迪库住在马林迪市肯尼亚我想告诉多一点关于一个好心人叫本杰明·布里尔·李与资助服务作为贷款官员,本杰明·布里尔·李先生帮我得到了37,115,225.00先令的贷款,我试图回到我的脚提高 我的生意,我知道有一些在财政困难,与本杰明先生谈什么应用程序+1-989-394-3740或他的个人电子邮件Lfdsloans@outlook.com我很高兴他为我做了什么,他的银行会计师以及会计师埃尔南德斯卢卡斯非常感谢你的工作做得很好。

    ReplyDelete