集训day_06

一、ListView入门

1.在布局中定义ListView控件

android:scrollbars="vertical"             //不可拖动的垂直滚动条
android:fastScrollEnabled="true"          //可拖动的垂直滚动条

2.定义ListView的数据适配器(BaseAdapter)

3.实现 BaseAdapter 的 getCount() 和 getView() 方法

private class MyListView extends BaseAdapter{

    @Override
    public int getCount() {                 //共有多少条数据需要显示
        return 1000;
    }

    @Override
    public Object getItem(int i) {          //返回指定position位置对应的对象
        return null;
    }

    @Override
    public long getItemId(int i) {          //返回指定position位置对应的id
        return 0;
    }

    //获取一个view,用来显示listview的数据,会作为listview的一个条目出现
    @Override
    public View getView(int i, View view, ViewGroup viewGroup) {
        TextView tv =  new TextView(MainActivity.this);
        tv.setText("哈哈"+i);
        return tv;
    }
}

4.找到组件并显示

ListView lv = (ListView) findViewById(R.id.lv_listView);

lv.setAdapter(new MyListView());

二、ListView 优化

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    TextView tv;
    if(view == null){                                //view为历史缓存对象
        tv =  new TextView(MainActivity.this);       //如果没有历史缓存对象,创建新的
    }else {
        tv = (TextView)view;                         //如果有,复用
    }
    tv.setText("哈哈"+i);
    return tv;
}

三、ListView 显示数据的原理

mvc:

      m:mode  数据(用javabean封装)

      v:view  视图(ListView)

      c:adapter  适配器

四、ListView 的奇怪现象

1.当LIstView 控件高度改为包括内容大小时,适配器中打印输出了很多次

System.out.println("hhhh哈哈"+i);            //改大小之后打印次数为原来的多倍

2.原因:当控件高度改为包括内容大小时,Android会“多次校验”可以不可以在屏幕中完全显示所有内容。

3. 之后再使用ListView控件是,高度设为填充父窗体。

五、打气筒的介绍

1.定义一个布局,左边图片,右上标题,右下内容

2.定义ListView 控件

3.通过打气筒把布局资源转换成一个view对象

public View getView(int i, View view, ViewGroup viewGroup) {
    View v;
    if (view == null){
        /*
        第一个参数:上下文
        第二个参数:就是我们定义的布局文件
        */
        v = View.inflate(MainActivity.this,R.layout.item,null);            //通过打气筒把布局资源转换成一个view对象
    }else {
        v = view;
    }
    return v;
}

4.找到并显示组件

六、获取打气筒常用api

        //第一种
v = v.inflate(MainActivity.this,R.layout.item,null);
        //第二种
v = LayoutInflater.from(getApplicationContext()).inflate(R.layout.item,null);
        //第三种
LayoutInflater layoutInflater = (LayoutInflater) getSystemService(LAYOUT_INFLATER_SERVICE);
v = layoutInflater.inflate(R.layout.item,null);

七、数组适配器介绍(ArrayAdapter)

public class MainActivity extends AppCompatActivity {

    String objects[] = {"老王","老李","老刘","老张"};        //先定义一个要显示的数组
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        ListView lv = findViewById(R.id.lv);                //找到listview控件
                                                            //创建一个arrayadapter
        ArrayAdapter<String> adapter = new ArrayAdapter<String>(this,R.layout.item,R.id.tv,objects);        
        lv.setAdapter(adapter);                             //设置数据适配器
    }
}

八、权重

1.用法

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"            //与下面控件平分大小  占二分之一
/>
<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_weight="1"
/>

2.只在线性布局中使用

九、SimpleAdapter

List<Map<String ,String >> data = new ArrayList<Map<String, String>>();  //提前准备的data数据
Map<String ,String > map1 = new HashMap<>();                //集合的泛型为Map,创建一个Map对象
map1.put("name","张三");                                     //存入数据
map1.put("phone","1388888");

Map<String ,String > map2 = new HashMap<>();
map2.put("name","李四");
map2.put("phone","1399999");

Map<String ,String > map3 = new HashMap<>();
map3.put("name","王五");
map3.put("phone","110");

data.add(map1);                                             //将Map对象放到集合中
data.add(map2);
data.add(map3);

SimpleAdapter adapter = new SimpleAdapter(            //五个参数
               getApplicationContext(),               //上下文
               data,                                  //数据:List< Map<String,String> >,数据要提前准备
               R.layout.item,                         //布局文件
               new String[]{"name","phone"},          //map集合中的键
               new int[]{R.id.tv_name,R.id.tv_phone});//显示到哪,显示数据的控件id

十、把数据库的数据展示到ListView上

1.在数据库中查询时把查询到的数据封装到 javabean 中(建一个Person类,name,phone两个属性,生成getter、setter方法)

2.一个人的数据为一个Person对象,分别存到集合中(List<Person> lp = new ArrayList<Person>() )

while (cursor.moveToNext()){
    String name = cursor.getString(1);
    String phone = cursor.getString(2);
    Person p = new Person();
    p.setName(name);
    p.setPhone(phone);
    lp.add(p);
}

3.新建ListView控件,集合的大小就是getCount()方法中需要显示数据的个数

@Override
public int getCount() {
    return lp.size();
}

4.定义用来显示的数据

@Override
public View getView(int i, View view, ViewGroup viewGroup) {
    View v;
    if(view == null){
        v = View.inflate(getApplicationContext(),R.layout.item,null);
    }else {
        v = view;
    }
    TextView tv_name = v.findViewById(R.id.tv_name);        //获取item布局中的控件
    TextView tv_phone = v.findViewById(R.id.tv_phone);
    Person p = lp.get(i);                                   //在集合中获取对象
    tv_name.setText(p.getName());                           //对象的属性显示在控件中
    tv_phone.setText(p.getPhone());
    return v;
}

5.点击查询时,再点击事件中调用显示ListView的方法

lv.setAdapter(new Myadapter());

 

猜你喜欢

转载自blog.csdn.net/depths_p/article/details/81177893
今日推荐