android-适配Adapter

Adapter是把数据和用户界面视图绑定到一起的桥梁类,负责创建用来表示父视图中的每一个条目的子视图,并提供对底层数据的访问。

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使用区别:

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上。

Adapter就相当于tableViewController,listView或tableView的一些关键回调都在它们中实现,但一些tableViewController中集成的viewController方法,在Adapter中则没有集成上Activity的方法,还是由listView所在的Activity中完成(Adapter和Activity本身类都不一致)。

即Adapter只完成和listView有关的回调。

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。