android-適配Adapter

Adapter是把數據和用戶界面視圖綁定到一塊兒的橋樑類,負責建立用來表示父視圖中的每個條目的子視圖,並提供對底層數據的訪問。android

public class MainActivity extends Activity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        
        ListView toDoListView = (ListView)findViewById(R.id.toDolistView);
        
        final ArrayList<String> todoItems = new ArrayList<String>();
//        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, android.R.layout.simple_list_item_1, todoItems);
        
        int resID = R.layout.todolist_item;
        final ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, resID, todoItems);
        
        //將adapter綁定到listView
        toDoListView.setAdapter(adapter);
        }    
}
//如果複雜對象的數組,數據的顯示須要定製的話則重寫adapter的geView方法
abstract public class MyListAdapter<T> extends BaseAdapter {

    private int listCellId;

    public MyListAdapter(Context context, int resId, List<T> items) {
        super(context, resId, items);
        listCellId = resId;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        
        if (convertView == null) {
            convertView =  LayoutInflater.from(getContext()).inflate(listCellId, null);
        }
        
                ((TextView)(convertView)).setText((String)getItem(position));
        
        return convertView;
    }

}

 

iOS的tableView使用數組

@implementation ContactsViewController

- (id)init
{
    if (self = [super init]) {
        
        contactTable = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
        contactTable.frame = CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height);
        contactTable.delegate = self;
        contactTable.dataSource = self;
        [self.view addSubview:contactTable];
    }
    return self;
}

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
    static NSString *identifier = @"cell";
    
    UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:identifier];
    
    if (!cell)
    {
        cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:identifier];
    }
    
    cell.textLabel.text = [[_contactList objectAtIndex:indexPath.row] objectForKey:PersonName];
    cell.detailTextLabel.text = [[_contactList objectAtIndex:indexPath.row] objectForKey:PersonTel];
    
    return cell;
}

- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
    NSLog(@"%d",_contactList.count);
    return _contactList.count;
}

 

iOS與Android的table使用區別:ide

iOS在viewController中定義一個數組成員變量,將viewController設置爲tableView的dataSource對象,而後在cellForRowAtIndexPath中建立或複用UI,並將數組成員變量根據行位置讀取相應數據後將其更新到UI。佈局

Android在activity中定義一個數組變量存放數據,利用該數組、activity的context、cell(子視圖)的樣式(xml)資源建立一個adapter,將該adapter設置爲listView的adapter屬性,而後在adapter的getView方法中根據樣式資源ID建立UI,並利用position和getItem方法將底層數組對應行的對象讀出並更新到UI上。this

Adapter就至關於tableViewController,listView或tableView的一些關鍵回調都在它們中實現,但一些tableViewController中集成的viewController方法,在Adapter中則沒有集成上Activity的方法,仍是由listView所在的Activity中完成(Adapter和Activity自己類都不一致)。spa

即Adapter只完成和listView有關的回調。code

 

SimpleCursorAdapterxml

SimpleCursorAdapter是經過傳入當前上下文、一個佈局資源、一個Cursor和兩個數組進行構建的,這兩個數組一個包含了要使用的列的名稱,一個存儲了用了顯示相應列的數據值的視圖資源ID。Cursor是指每行的集合。SimpleCursorAdapter可把一個佈局中指定的視圖和內容提供器查詢返回的遊標列綁定到一塊兒。對象

String uriString = "content://contacts/people";
Cursor myCursor = managedQuery(Uri.parse(uriString), null, null, null);
String[] fromColumns = new String[] {People.NUMBER, People.NAME};
int[] toLayoutIDs = new int[] {R.id.nameTextView, R.id.numberTextView};

SimpleCursorAdapter myAdapter;
myAdapter = new SimpleCursorAdapter(this, R.layout.simplecursorlayout, myCursor, fromColumns, toLayoutIDs);
myListView.setAdapter(myAdapter);
相關文章
相關標籤/搜索