ios学习了这么长时间,再学习android(和我之前学习C#转ios感觉一样)总想的是:在ios是这么做的,那么在android里面是不是有类似的做法呢?答案肯定是:有!
我说一说我学习android控件listview(和UITableview差不多的一个表控件)。
先说思路:
a.是不是有类似xib让我可以自定每个cell(ios)?有,叫做item 对应是XML,其实xib也是可以用xml编辑的。
b.是不是有类似UITableView的回调方法?有,叫做适配器(其实是ios的delegate对应android或是java中接口或抽象类)。
1).返回行
2).返回每个item/cell
3).给每一行添加单击事件
4).获取每一行里面的控件赋值
5).如何将item的xml映射(或者叫绘制)成view
其实一对比结果发现它们有太多的相似了。看看实现过程:
表的样式:
1.穿件一个Android项目(过程省略了)。
2.在activity_main.xml中添加listview :
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical" >
<ListView
android:id="@+id/listView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
></ListView>
</LinearLayout>
3.在layout中添加一个item的xml布局文件(名字为:item_xml.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_parent"
android:orientation="horizontal" >
<ImageView
android:id="@+id/img"
android:layout_width="71dp"
android:layout_height="71dp"
android:src="@drawable/ic_launcher" />
<LinearLayout
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="vertical" >
<TextView
android:id="@+id/title"
android:layout_width="242dp"
android:layout_height="wrap_content"
android:text="222"
android:textAppearance="?android:attr/textAppearanceMedium" />
<TextView
android:id="@+id/info"
android:layout_width="match_parent"
android:layout_height="47dp"
android:text="11" />
</LinearLayout>
</LinearLayout>
上面三步完成,工作已经完成一半,下面就需要完成,如何把item的xml文件在listview中显示。
用ios的说法,需要给表制定数据源和代理返回cell。
4.添加一个单独的java类extended baseadapter(单独在建一个java的package),同时实现它的几个代理方法(名字为ListAdapter.java):
package com.example.adapter;
import com.example.hello.R;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
public class ListAdapter extends BaseAdapter
{
Context myContext;
LayoutInflater myInflater;
public ListAdapter(Context context)
{
this.myContext = context;
this.myInflater = LayoutInflater.from(context);
}
@Override
public int getCount()
{
//返回行数
return 23;
}
@Override
public Object getItem(int arg0) {
// TODO Auto-generated method stub
return null;
}
@Override
public long getItemId(int arg0) {
// TODO Auto-generated method stub
return 0;
}
@Override
public View getView(int arg0, View arg1, ViewGroup arg2) {
// TODO Auto-generated method stub
if (arg1 == null)
{
//将XML绘制成view
arg1 = this.myInflater.inflate(R.layout.item_xml, null);
}
return arg1;
}
好了,适配器也写完了,这里把表的行数,返回每个行的view都完成了。
5.把上面的4步综合整理,让这个表显示出来在activity中的java文件中写下:
package com.example.hello;
import com.example.adapter.ListAdapter;
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.AdapterView;
import android.widget.AdapterView.OnItemClickListener;
import android.widget.ListView;
public class ThreeActivity extends Activity
{
ListView myListView;
ListAdapter myAdapter;
@Override
protected void onCreate(Bundle savedInstanceState)
{
// TODO Auto-generated method stub
super.onCreate(savedInstanceState);
setContentView(R.layout.third_activity);
//适配器
myAdapter = new ListAdapter(this);
myListView = (ListView) findViewById(R.id.listView);
myListView.setAdapter(myAdapter);
//给每个item添加一个单击事件
myListView.setOnItemClickListener(new OnItemClickListener() {
@Override
public void onItemClick(AdapterView<?> arg0, View arg1, int arg2,
long arg3)
{
// TODO Auto-generated method stub
Log.v( Integer.toString(arg2), "onclick()");
}
});
}
}