美文网首页
Controller 中 ListView 和 UITableV

Controller 中 ListView 和 UITableV

作者: 738bc070cd74 | 来源:发表于2015-09-26 09:56 被阅读351次

    在 MVC 结构中,Android的 C 表现为 Activity 的使用;iOS 的 C 表现为 UIViewController 的使用。在使用列表时会导致相应的 C 代码较多,这里分别简单介绍下关于 列表 的瘦身技巧。

    iOS 中 UIViewController 使用 UITableView

    基本使用

    • 实现 UITableViewDataSource 协议
    • 设置 tableView 的数据源协议
    • 实现相关的代理方法
    #import "HBViewController.h"
    #import "TestDataSource.h"
    
    @interface HBViewController ()
    {
        UITableView             *_tableView;
        TestDataSource          *_dataSource;
    }
    
    @end
    
    @implementation HBViewController
    
    - (void)viewDidLoad {
        [super viewDidLoad];
    
        [self initView];
    
        NSArray *data = @[@"data 1", @"data 2", @"data 3", @"data 4"];
    
        void (^configureCell)(UITableViewCell *, NSString *) = ^(UITableViewCell *cell, NSString *text) {
            cell.textLabel.text = text;
        };
    
        _dataSource = [[TestDataSource alloc] initWithItems:data cellIdentifier:@"CELL" configureCellBlock:configureCell];
        _tableView.dataSource = _dataSource;
    }
    
    - (void)didReceiveMemoryWarning {
        [super didReceiveMemoryWarning];
    }
    
    #pragma mark - initView
    - (void)initView
    {
        _tableView = [[UITableView alloc] initWithFrame:self.view.frame style:UITableViewStylePlain];
        _tableView.backgroundColor = [UIColor grayColor];
        _tableView.tableFooterView = [UIView new];
        [self.view addSubview:_tableView];
    }
    @end
    

    把 Data Source 和 Protocols 分离出来

    在基本实现中相关的代码基本上是围绕数据的,这里可以将这些代码封装到一个类中
    1.使用外部类TestDataSource 设置为 tableView的dataSource

    _dataSource = [[TestDataSource alloc] initWithItems:data cellIdentifier:@"CELL" configureCellBlock:configureCell];
    _tableView.dataSource = _dataSource;
    

    2.TestDataSource .h 实现 UITableViewDataSource 协议

    #import <UIKit/UIKit.h>
    #import <Foundation/Foundation.h>
    
    typedef void(^configureCell)(UITableViewCell *, id);
    
    @interface TestDataSource : NSObject<UITableViewDataSource>
    
    - (id)initWithItems:(NSArray *)items cellIdentifier:(NSString *)identifier configureCellBlock:(configureCell)configureCell;
    
    @end
    

    3.TestDataSource.m 具体实现相关方法

    #import "TestDataSource.h"
    
    @interface TestDataSource ()
    {
        NSArray             *_items;
        NSString            *_identifier;
        configureCell       configureCellBlock;
    }
    
    @end
    
    @implementation TestDataSource
    
    - (id)initWithItems:(NSArray *)items cellIdentifier:(NSString *)identifier configureCellBlock:(configureCell)configureCell
    {
        self = [super init];
        if (self) {
            _items = items;
            _identifier = identifier;
            configureCellBlock = configureCell;
        }
        return self;
    }
    
    - (id)itemAtIndexPath:(NSIndexPath *)indexPath
    {
        return _items[indexPath.row];
    }
    
    - (NSInteger)tableView:(UITableView *)tableView  numberOfRowsInSection:(NSInteger)section
    {
        return _items.count;
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    {
        id cell = [tableView dequeueReusableCellWithIdentifier:_identifier];
        if (!cell) {
            cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:_identifier];
        }
        id item = [self itemAtIndexPath:indexPath];
        if (configureCellBlock) {
            configureCellBlock(cell, item);
        }
    
        return cell;
    }
    
    @end
    

    Android 中 Activity 使用 ListView

    基本使用

    public class MainActivity extends Activity {
    
    ListView listView;
    BaseAdapter adapter;
    List<String> usernames = new ArrayList<String>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        
        listView = (ListView) findViewById(R.id.listview);
        adapter = new BaseAdapter() {
            
            @Override
            public View getView(int position, View convertView, ViewGroup parent) {
                ViewHolder holder;
                if(convertView == null) {
                    holder = new ViewHolder();
                    convertView = getLayoutInflater().inflate(R.layout.item_listview, null);
                    holder.nameTv = (TextView) convertView.findViewById(R.id.item);
                    convertView.setTag(holder);
                } else {
                    holder = (ViewHolder) convertView.getTag();
                }
                String name = (String) getItem(position);
                holder.nameTv.setText(name);
                return convertView;
            }
            
            @Override
            public long getItemId(int position) {
                return position;
            }
            
            @Override
            public Object getItem(int position) {
                return usernames.get(position);
            }
            
            @Override
            public int getCount() {
                return usernames.size();
            }
        };
        listView.setAdapter(adapter);
    }
    
    static class ViewHolder {
        TextView nameTv;
    }
    }
    

    BaseAdapter 分离

    1. Listview 使用外部类NameAdapter
    public class MainActivity extends Activity {
    
    ListView listView;
    List<String> usernames = new ArrayList<String>();
    
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        usernames.add("zhangsan");
        usernames.add("lisi");
        usernames.add("wangwu");
        listView = (ListView) findViewById(R.id.listview);
        listView.setAdapter(new NameAdapter(this, usernames));
    }
    
    }
    

    2.实现NameAdapter继承于BaseAdapter

    public class NameAdapter extends BaseAdapter {
    
    private Context mContext;
    private List<String> mUsernames;
    
    public NameAdapter(Context context, List<String> usernames) {
        mContext = context;
        mUsernames = usernames;
    }
    
    @Override
    public int getCount() {
        return mUsernames.size();
    }
    
    @Override
    public Object getItem(int position) {
        return mUsernames.get(position);
    }
    
    @Override
    public long getItemId(int position) {
        return position;
    }
    
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        ViewHolder holder;
        if(convertView == null) {
            holder = new ViewHolder();
            convertView = LayoutInflater.from(mContext).inflate(R.layout.item_listview, null);
            holder.nameTv = (TextView) convertView.findViewById(R.id.item);
            convertView.setTag(holder);
        } else {
            holder = (ViewHolder) convertView.getTag();
        }
        String name = (String) getItem(position);
        holder.nameTv.setText(name);
        return convertView;
    }
    
    static class ViewHolder {
        TextView nameTv;
    }
    }
    

    总结

    在使用 MVC 架构时,应该让各个模块尽可能的实现自己的业务,避免耦合。controller 的抽取尤其重要,Activity 和 UIViewController 作为各自平台的控制层,代码会相应的长很多,对于后期的维护扩展及其的不利。在开发过程中要控制好Controller的体积。

    相关文章

      网友评论

          本文标题:Controller 中 ListView 和 UITableV

          本文链接:https://www.haomeiwen.com/subject/nrwicttx.html