Android------自定义ListView详解
引自:http://www.cnblogs.com/phonegap/archive/2011/04/28/2535732.html
在这里我就对自定义ListView进行讲解下吧,直入真题吧,首先我新创建一个项目:listDemo;
其次,我们需要建立一个XML文件,在这里我就直接写在main.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" > <ListView android:id="@+id/listView" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
然后我们需要定义一个ITEM.XML来显示其数据:
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="horizontal" android:layout_width="fill_parent" android:layout_height="fill_parent" > <ImageView android:id="@+id/images_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:src="@drawable/icon" /> <LinearLayout android:orientation="vertical" android:layout_width="wrap_content" android:layout_height="wrap_content" > <TextView android:id="@+id/text_id" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="default_001" /> <TextView android:id="@+id/text_info" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="default_info" /> <TextView android:id="@+id/text_url" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="default_url" /> </LinearLayout> </LinearLayout>
现在我们把XML文件做好了,就是对其适配数据的布局进行定义了,首先我们需要创建一个类:
package com.jsd; import java.util.ArrayList; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.widget.ListView; import com.jsd.adapter.AppAdapter; import com.jsd.model.AppInfos; /** * ListView customer * @author jiangshide * */ public class Demo extends Activity { private Context mContext; private ListView listView; private ArrayList<AppInfos> appInfos; private AppAdapter appAdapter; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); getComponenets(); } /** * componenet */ public void getComponenets(){ this.mContext = this; listView = (ListView) findViewById(R.id.listView); appInfos = new ArrayList<AppInfos>(); loadDatas(); appAdapter = new AppAdapter(mContext,appInfos); listView.setAdapter(appAdapter); } /** * load datas */ public void loadDatas(){ for (int i = 0; i < 10; i++) { AppInfos ai = new AppInfos(); if(i == 1){ ai.setImages(R.drawable.icon); }else if(i == 2){ ai.setImages(R.drawable.item1); }else if(i == 3){ ai.setImages(R.drawable.item2); }else if(i == 4){ ai.setImages(R.drawable.item3); }else if(i == 5){ ai.setImages(R.drawable.item4); }else if(i == 6){ ai.setImages(R.drawable.item5); } ai.setText_id("001"); ai.setText_infos("这是我们都需要注意的..."); ai.setText_url("http://jiangshide.com"); appInfos.add(ai); } } }
这位主线程的UI类,
其实需要穿件一个适配器需要继承BaseAdapter:
package com.jsd.adapter; import java.util.ArrayList; import android.content.Context; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import com.jsd.model.AppInfos; import com.jsd.view.AppView; /** * Adapter * @author jiangshide * */ public class AppAdapter extends BaseAdapter { private Context mContext; private ArrayList<AppInfos> appInfos; public AppAdapter(Context c) { this.mContext = c; } public AppAdapter(Context c,ArrayList<AppInfos> appInfos) { this.mContext = c; this.appInfos = appInfos; } public int getCount() { return appInfos.size(); } public Object getItem(int position) { return appInfos.get(position); } public long getItemId(int position) { return position; } /** * get view */ public View getView(int position, View convertView, ViewGroup parent) { if(appInfos == null){ return null; } if(convertView == null){ AppView appView = new AppView(mContext); appView.updateView(appInfos.get(position)); convertView = appView; }else{ ((AppView)convertView).updateView(appInfos.get(position)); } return convertView; } } 为了对其数据进行适配,我们需要对数据进行持久话:使用BEAN的方式进行保存 package com.jsd.model; /** * datas * @author jiangshide * */ public class AppInfos { private int images; private String text_id; private String text_infos; private String text_url; public int getImages() { return images; } public void setImages(int images) { this.images = images; } public String getText_id() { return text_id; } public void setText_id(String textId) { text_id = textId; } public String getText_infos() { return text_infos; } public void setText_infos(String textInfos) { text_infos = textInfos; } public String getText_url() { return text_url; } public void setText_url(String textUrl) { text_url = textUrl; } }
再次就是对View显示布局的控件进行定义来对数据参数的获取
package com.jsd.view; import android.content.Context; import android.view.LayoutInflater; import android.view.View; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.jsd.R; import com.jsd.model.AppInfos; /** * View * @author jiangshide * */ public class AppView extends LinearLayout { private Context mContext; private ImageView image_id; private TextView text_id,text_info,text_url; /** * * @param context */ public AppView(Context context) { super(context); this.mContext = context; initilize(context); } /** * * @param c */ public void initilize(Context c){ this.mContext = c; View view = LayoutInflater.from(this.mContext).inflate(R.layout.item, null); image_id = (ImageView) view.findViewById(R.id.images_id); text_id = (TextView) view.findViewById(R.id.text_id); text_info = (TextView) view.findViewById(R.id.text_info); text_url = (TextView) view.findViewById(R.id.text_url); addView(view); } /** * * @param ai */ public void updateView(AppInfos ai){ image_id.setImageResource(ai.getImages()); text_id.setText(ai.getText_id()); text_info.setText(ai.getText_infos()); text_url.setText(ai.getText_url()); } }
OK,以上就是完整的代码实现对ListView的自定义的实现,