Android pri (19)

Android Basics: Multiscreen Apps

Lesson 2: Data, Loops, Custom Classes

Log.v

  • 又来复习了一下Log.v的作用,它的格式是:
  • Log.v(String tag, String msg);
  • tag: Used to identify the source of a log message. It usually identifies the class or activity where the log call occurs. (也就是说明了这个log是哪个class或者activity调用的)
  • msg:就是你自己想要加上去的信息。

Array & ArrayList

  • Markdown
  • ArrayList是一个class,并且它其中只能够存储Objects(像Integer啊这样子的)。
  • Markdown
  • ArrayList Reference

Memory Monitor

  • 使用Memory Monitor可以很方便的管理和监控Android App的使用情况。

ListView & ArrayAdapter

  • ListView is powered by ArrayAdapter.
  • ArrayAdapter holds the data that should be shown onto the screen.
  • List Item View只会当用户改变他们的位置的时候才会继续请求data从ArrayAdapter中。然后看不见的将会被回收,recycled,然后请求新的东西从ArrayAdapter中。
  • ArrayAdapter(数组适配器),用于显示一行文本信息。
  • ArrayAdapter(Context context,int textViewResourceId,List objects),Context一般为this,后面那个是布局文件,android.R.layout.simple_list_item_1是系统定义好的布局文件只显示一行文字。最后那个参数是数据源,数据源(一个List集合)。
  • 同时用setAdapter()将ListView和Adapter绑定。
  • Markdown

Build ListItem Layout

  • 因为默认的simple_list_item_1默认是一行中只有一个TextView的,但是我们现在要让一行中有两个TextView,所以我们要自定义一下我们的ListView的Layout!
  • 所以我们就自定义了一个Layout Resource File。

xmlns

  • xmlns: 它的意思是xml namespace.
  • tools xmlns:
  • Markdown
  • 这个意思是:将tools后面的https映射到前面的tools关键字中,如果其中有以tools为开头的话,那么就说明这个xml属性是在tools这个命名空间里面的。
  • 在这里我们使用的是tools里面的text属性,有一个好处就是如果你利用这个来设置text的话,它会在preview的时候出现text,但是在最终运行的时候是不会显现出来的。
  • tools xmlns References
  • 这个对于我们测试的时候是非常好用的!

Custom Class

  • 因为我们这里是要实现一个List Item中上面有Miwok文字的,然后下面是English的样子,所以我们的Arraylist肯定不能是String类型了,而应该是Object类型,然后我们将这两种文字都捆绑起来放到一个Object对象中,所以因此我们也需要修改一下ArrayList和ArrayAdapter中的T对象的类型!
  • 我们创建了一个Word类
  • Markdown
  • 当然这样写是有点问题的,所以我们要进行接下来的修改步骤!

Custom ArrayAdapter

  • 一个自定义的ArrayAdapter!
  • 为什么要使用自定义的ArrayAdapter呢?
  • 因为我们需要将我们自己定义的Java model转化到View中去(在getView方法中进行!)
  • That adapter has a constructor and a getView() method to describe the translation between the data item and the View to display.
  • getView() is the method that returns the actual view used as a row within the ListView at a particular position.

Reflection

  • 整个的过程看起来就像是这样的:
  • (1)首先第一部是存储你自定义的Objects
  • Markdown
  • 这里我们使用了自定义的ArrayList来存放我们的custom objects。
  • Markdown
  • (2)我们创建了一个自定义的adapter(适配器)继承自ArrayAdapter,并将自定义的Object作为参数。
  • Markdown
  • Markdown
  • (3)我们修改适配器类中的getView()方法,为了提供一个ListItem View for your ListView.
  • 这里的步骤其实就是为了将我们自定义的xml布局文件(ListView的布局文件)变成一个实际的视图对象。
  • Markdown
  • Markdown

具体代码

  • NumbersActivity.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    package com.example.android.miwok;
    import android.os.Bundle;
    import android.support.v7.app.AppCompatActivity;
    import android.widget.ListView;
    import java.util.ArrayList;
    public class NumbersActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.word_list);
    ArrayList<Word> words = new ArrayList<Word>();
    words.add(new Word("one", "lutti"));
    words.add(new Word("two", "otiiko"));
    words.add(new Word("three", "tolookosu"));
    words.add(new Word("four", "oyyisa"));
    words.add(new Word("five", "massokka"));
    words.add(new Word("six", "temmokka"));
    words.add(new Word("seven", "kenekaku"));
    words.add(new Word("eight", "kawinta"));
    words.add(new Word("nine", "wo'e"));
    words.add(new Word("ten", "na'aacha"));
    WordAdapter wordAdapter = new WordAdapter(this, words);
    ListView listView = (ListView) findViewById(R.id.list);
    // 这样我们就能够往其中进行填充数据了!
    listView.setAdapter(wordAdapter);
    }
    }
  • WordAdapter.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    package com.example.android.miwok;
    import android.content.Context;
    import android.view.LayoutInflater;
    import android.view.View;
    import android.view.ViewGroup;
    import android.widget.ArrayAdapter;
    import android.widget.TextView;
    import java.util.List;
    /**
    * Created by hclmaster on 2017/1/20.
    */
    public class WordAdapter extends ArrayAdapter<Word> {
    // 虽然这里创建的默认构造方法是有三个参数的
    // 但是你可以把中间那个resource删掉,因为我们这里用不到!
    public WordAdapter(Context context, List<Word> objects) {
    super(context, 0, objects);
    }
    // convertView:是需要被填充的回收视图!
    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
    // Get the data item for this position
    Word word = getItem(position);
    // 检查现有视图是否为空,否则扩充视图!
    // 一般来说,一开始打开Activity的时候,一般都是没有可以重用的图的!
    if (convertView == null) {
    // 如果为null的话,那么我们就从list_item中隐式的展开视图
    // 其实就是将XML布局文件变成实际的视图对象
    convertView = LayoutInflater.from(getContext()).inflate(R.layout.list_item, parent, false);
    }
    TextView tvMiwok = (TextView) convertView.findViewById(R.id.miwok_text_view);
    TextView tvDefault = (TextView) convertView.findViewById(R.id.default_text_view);
    tvMiwok.setText(word.getmMiwokTranslation());
    tvDefault.setText(word.getmDefaultTranslation());
    return convertView;
    }
    }
  • Word.java

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    package com.example.android.miwok;
    /**
    * Created by hclmaster on 2017/1/20.
    */
    public class Word {
    private String mDefaultTranslation;
    private String mMiwokTranslation;
    public Word(String mDefaultTranslation, String mMiwokTranslation) {
    this.mDefaultTranslation = mDefaultTranslation;
    this.mMiwokTranslation = mMiwokTranslation;
    }
    public String getmDefaultTranslation() {
    return mDefaultTranslation;
    }
    public String getmMiwokTranslation() {
    return mMiwokTranslation;
    }
    public void setmDefaultTranslation(String mDefaultTranslation) {
    this.mDefaultTranslation = mDefaultTranslation;
    }
    public void setmMiwokTranslation(String mMiwokTranslation) {
    this.mMiwokTranslation = mMiwokTranslation;
    }
    }
  • 实现效果:

  • Markdown

生词: Generics Class(泛型类)

热评文章