通过Android Studio可视化编辑器可以通过拖拽方式完成界面布局,但这种方式生成的界面通常不具有很好的屏幕适配性,而且编写较为复杂界面时,通过可视化编辑器实现效果也不好。建议新手还是通过xml方式编写界面。通过Android Studio强大的智能提示,使用xml方式编写界面也是很方便的。

Android常用控件

TextView

TextView应该是最常用的一个控件,用来显示一段文本内容。简单的TextView用法如下:

    <TextView
        android:id="@+id/text_view_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="This is a TextView1!" />

    <TextView
        android:id="@+id/text_view_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:text="This is a TextView2!" />

    <TextView
        android:id="@+id/text_view_3"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:gravity="center"
        android:textSize="24sp"
        android:textColor="#00ff00"
        android:text="This is a TextView3!" />
  • android:id:给控件定义一个唯一标识符;
  • android:layout_widthandroid:layout_height:定义控件宽度和高度,可选择有wrap_contentmatch_parent,和fill_parent,一般用wrap_contentmatch_parent
  • android:text:定义控件显示的文本内容;
  • android:gravity:指定控件文字的对齐方式,可选择有topbottomleftrightcentercenter_horizontalcenter_vertical等,可以用管道符"|"来同时指定多个值;
  • android:textSize:定义文字的大小;
  • android:textColor:定义文字颜色。

Button

Button按钮控件,Android系统默认会对按钮中的英文字母进行大写转换,如果想要保持原始文本内容,可以通过android:textAllCaps="false"进行禁用:

    <Button
        android:id="@+id/button_view_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 1" />

    <Button
        android:id="@+id/button_view_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="Button 2"
        android:textAllCaps="false" />

EditText

EditText输入控件:

    <EditText
        android:id="@+id/edit_text_1"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <EditText
        android:id="@+id/edit_text_2"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:hint="Type Something."
        android:maxLines="2"/>
  • android:hint:指定输入控件的提示文本,类似Html的input的placeholder属性;
  • android:maxLines:默认输入口控件随着输入的内容会自动拉长,但是如果内容过多,显示会很难看,可以通过这个属性定义最大行数,如果超过了嘴大行数时,文本会滚动,输入控件不再继续拉伸。

ImageView

ImageView图片显示控件。

    <ImageView
        android:id="@+id/image_view"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:src="@drawable/img_1"/>

通过android:src属性给图片控件指定一张图片。

ProgressBar

ProgressBar进度条控件:

    <!-- 默认为圆形进度条 -->
    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />

    <!-- 设置为水平进度条 -->
    <ProgressBar
        android:id="@+id/progress_bar"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100" />

所有Android控件都具有android:visibility属性,用来指定控件是否可见,可选值有:gone, invisible, visible

  • visible:表示控件可见,是默认值;
  • invisible:表示控件不可见,但仍占着原来的位置和大小,类似完全透明了;
  • gone:表示控件不可见,同时不再占用屏幕位置和大小。
// 设置控件变为可见
progressBar.setVisibility(View.VISIBLE);

// 设置控件变为不可见
progressBar.setVisibility(View.GONE);

AlertDialog

AlertDialog弹出对话框,这个控件会置顶与所有界面之上,并且能屏蔽掉其他控件的交换操作。

    AlertDialog.Builder dialog = new AlertDialog.Builder(MainActivity.this);
    dialog.setTitle("This is dialog");
    dialog.setMessage("Here is message.");
    dialog.setPositiveButton("OK", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this, "Dialog Positive Button was pressed", Toast.LENGTH_LONG).show();
        }
    });
    dialog.setNegativeButton("Cancel", new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int which) {
            Toast.makeText(MainActivity.this, "Dialog Negative Button was pressed", Toast.LENGTH_LONG).show();
        }
    });
    dialog.show();

Android基本布局

Android中有4中最基本的布局:LinearLayout线性布局、RelativeLayout相对布局、FrameLayout帧布局、PercentFrameLayoutPercentRelativeLayout百分比布局。

LinearLayout线性布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

</LinearLayout>

android:orientation属性
该属性指定排列方向,可选择有horizontal, verticalhorizontal布局下的控件会在水平方向排列;vertical布局下的控件会在垂直方向排列。
注意:如果排列方向是horizontal,内部控件不能将android:layout_width宽度指定为match_parent,否则单独一个控件就会将整个水平方向占满;如果排列方向是vertical,内部控件不能将android:layout_height高度指定为match_parent,否则单独一个控件就会将整个垂直方向占满。

android:gravity属性与android:layout_gravity属性的区别
android:gravity用于指定文字在控件内对齐方式;
android:layout_gravity用于指定控件在布局中的对齐方式。

android:layout_weight属性
通过这个属性,我们可以以比例的方式来指定空间的大小。
原理是,系统先将指定layout_weight属性的值相加得到总数,然后每个控件根据所占比例计算出各自的宽度。
将水平方向2个控件平分:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <Button
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"
        android:text="Button"/>
</LinearLayout>

一个控件占内容宽度,另一个控件占满剩下宽度:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="horizontal"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <EditText
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_weight="1"/>
    <Button
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Button"/>
</LinearLayout>

RelativeLayout相对布局

默认是按父布局进行相对定位:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="Button 1"/>

    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentTop="true"
        android:text="Button 2"/>

    <Button
        android:id="@+id/button_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Button 3"/>

    <Button
        android:id="@+id/button_4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentBottom="true"
        android:text="Button 4"/>

    <Button
        android:id="@+id/button_5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentRight="true"
        android:layout_alignParentBottom="true"
        android:text="Button 5"/>
</RelativeLayout>

效果图:
RelativeLayout_01.png

通过指定控件进行定位:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_3"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_centerInParent="true"
        android:text="Button 3"/>

    <Button
        android:id="@+id/button_1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/button_3"
        android:layout_toLeftOf="@id/button_3"
        android:text="Button 1"/>

    <Button
        android:id="@+id/button_2"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_above="@id/button_3"
        android:layout_toRightOf="@id/button_3"
        android:text="Button 2"/>

    <Button
        android:id="@+id/button_4"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button_3"
        android:layout_toLeftOf="@id/button_3"
        android:text="Button 4"/>

    <Button
        android:id="@+id/button_5"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_below="@id/button_3"
        android:layout_toRightOf="@id/button_3"
        android:text="Button 5"/>
</RelativeLayout>

效果图:
RelativeLayout_02.png

FrameLayout帧布局

一般应用比较少,没有方便的定位方式,所有的控件默认都摆放在布局的左上角。

PercentFrameLayoutPercentRelativeLayout百分比布局

首先需要引入依赖:

implementation 'com.android.support:percent:28.0.0'

然后就可以定义布局文件:下面是在界面放4个按钮,每个按钮宽度和高度各自50%。

<android.support.percent.PercentFrameLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <Button
        android:id="@+id/button_1"
        android:text="Button 1"
        android:layout_gravity="left|top"
        app:layout_widthPercent="50%"
        app:layout_heightPercent="50%"
        />

    <Button
        android:id="@+id/button_2"
        android:text="Button 2"
        android:layout_gravity="right|top"
        app:layout_widthPercent="50%"
        app:layout_heightPercent="50%"
        />

    <Button
        android:id="@+id/button_3"
        android:text="Button 3"
        android:layout_gravity="left|bottom"
        app:layout_widthPercent="50%"
        app:layout_heightPercent="50%"
        />

    <Button
        android:id="@+id/button_4"
        android:text="Button 4"
        android:layout_gravity="right|bottom"
        app:layout_widthPercent="50%"
        app:layout_heightPercent="50%"
        />
</android.support.percent.PercentFrameLayout>

自定义布局和控件

自定义布局

可以通过自定定义来引入一个布局。
比如自定义一个tital_layout.xml的布局

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="@drawable/title_bg">

    <Button
        android:id="@+id/title_back"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dp"
        android:background="@drawable/back_bg"
        android:text="Back"
        android:textColor="#fff"/>
    <TextView
        android:id="@+id/title_text"
        android:layout_width="0dp"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_weight="1"
        android:gravity="center"
        android:text="Title Text"
        android:textColor="#fff"
        android:textSize="24sp"/>
    <Button
        android:id="@+id/title_edit"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:layout_margin="5dp"
        android:background="@drawable/edit_bg"
        android:text="Edit"
        android:textColor="#fff"/>
</LinearLayout>

然后其他布局中就可以通过下面的方法进行引用:
<include layout="@layout/tital_layout" />

自定义控件

public class TitleLayout extends LinearLayout {

    public TitleLayout(Context context, AttributeSet attrs) {
        super(context, attrs);
        LayoutInflater.from(context).inflate(R.layout.title_layout, this);
        Button titleBack = (Button) findViewById(R.id.title_back);
        Button titleEdit = (Button)findViewById(R.id.title_edit);
        titleBack.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                ((Activity)getContext()).finish();
            }
        });
        titleEdit.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                Toast.makeText(getContext(), "Edit Button", Toast.LENGTH_LONG).show();
            }
        });
    }
}

在布局文件中使用该控件:

    <com.jyoryo.demo.layout.TitleLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
     />

ListView控件

ListView是Android中最常见的控件,只要是有大量数据需要显示,基本都会用到,当然这个控件也是比较复杂和难用。

ListView基础用法

布局中添加ListView控件:

    <ListView
        android:id="@+id/list_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

活动中使用控件并填充数据:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        String data [] = {"item1", "item2", "item3", "item4", "item5", "item6", "item7", "item8", "item9", "item10"};
        ArrayAdapter<String> adapter = new ArrayAdapter<>(MainActivity.this, android.R.layout.simple_list_item_1, data);
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);
    }

ListView定制界面

定制ListView界面需要为子项数据定义布局,比如定义一个:list_item_layout.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content" />

    <TextView
        android:id="@+id/item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_vertical"
        android:layout_marginLeft="10dp"/>
</LinearLayout>

这个自定布局定义了一个ImageView用于显示项目图片,定义一个TextView用于显示项目名称,并让文本内容在控件内垂直方向上居中显示。

定义好布局后,需要创建自定义的适配器,这个适配器继承ArrayAdapter,并将泛型指定为子项数Item类:
Item类:

public class Item {
    private String name;
    private int imageId;

    public Item(String name, int imageId) {
        this.name = name;
        this.imageId = imageId;
    }

    public String getName() {
        return name;
    }

    public int getImageId() {
        return imageId;
    }
}

适配器类:

public class ItemAdapter extends ArrayAdapter<Item> {
    private int resourceId;

    public ItemAdapter(Context context, int resource, List<Item> objects) {
        super(context, resource, objects);
        resourceId = resource;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        // 当前项目
        Item item = getItem(position);
        View view;
        ViewHolder viewHolder;
        if(null == convertView) {
            view = LayoutInflater.from(getContext()).inflate(resourceId, parent, false);
            viewHolder = new ViewHolder();
            viewHolder.itemImage = (ImageView)view.findViewById(R.id.item_image);
            viewHolder.itemName = (TextView)view.findViewById(R.id.item_name);
            view.setTag(viewHolder);
        } else {
            view = convertView;
            viewHolder = (ViewHolder)view.getTag();
        }
        viewHolder.itemImage.setImageResource(item.getImageId());
        viewHolder.itemName.setText(item.getName());
        return view;
    }

    class ViewHolder {
        ImageView itemImage;
        TextView itemName;

        // getter setter ...
    }
}

在活动中使用自定义的ListView:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initItems();
        ItemAdapter adapter = new ItemAdapter(MainActivity.this, R.layout.list_item_layout, itemList);
        ListView listView = (ListView) findViewById(R.id.list_view);
        listView.setAdapter(adapter);
        // ListView 点击事件
        listView.setOnItemClickListener(new AdapterView.OnItemClickListener() {
            @Override
            public void onItemClick(AdapterView<?> parent, View view, int position, long id) {
                Item item = itemList.get(position);
                Toast.makeText(MainActivity.this, item.getName(), Toast.LENGTH_LONG).show();
            }
        });
    }

    /**
     * 生成测试数据
     */
    private void initItems() {
        for(int i = 0; i < 3; i ++) {
            itemList.add(new Item("Apple", R.drawable.apple_pic));
            itemList.add(new Item("Banana", R.drawable.banana_pic));
            itemList.add(new Item("Orange", R.drawable.orange_pic));
            itemList.add(new Item("Watermelon", R.drawable.watermelon_pic));
            itemList.add(new Item("Pear", R.drawable.pear_pic));
            itemList.add(new Item("Grape", R.drawable.grape_pic));
            itemList.add(new Item("Pineapple", R.drawable.pineapple_pic));
            itemList.add(new Item("Strawberry", R.drawable.strawberry_pic));
            itemList.add(new Item("Cherry", R.drawable.cherry_pic));
            itemList.add(new Item("Mango", R.drawable.mango_pic));
        }
    }

RecyclerView控件

ListView在过去Android上应用的非常广泛,但是它也有不少缺点。比如说需要使用一些技巧提升ListView运行效率;ListView扩展性不是很好,它只能实现纵向滚动(上下方向),无法实现横向滚动。为此Android提供了更加强大的滚动控件RecyclerView,可以说它是ListView的增强版。目前官方也是更加推荐使用RecyclerView滚动控件。

RecyclerView基本用法

  1. 和上面的百分比布局类似,RecyclerView由于是新增控件,需要我们在build.gradle添加依赖:

    implementation 'com.android.support:recyclerview-v7:24.2.1'
  2. 布局中使用RecyclerView控件

       <android.support.v7.widget.RecyclerView
           android:id="@+id/recycler_view"
           android:layout_width="match_parent"
           android:layout_height="match_parent"/>
  3. 自定义列表数据布局item_layout.xml

    <?xml version="1.0" encoding="utf-8"?>
    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
       android:layout_width="match_parent"
       android:layout_height="wrap_content">
    
       <ImageView
           android:id="@+id/item_image"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content" />
    
       <TextView
           android:id="@+id/item_name"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           android:layout_gravity="center_vertical"
           android:layout_marginTop="10dp" />
    
    </LinearLayout>
  4. 自定义适配器

    public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHoder> {
       List<Item> mItemList;
    
       static class ViewHoder extends RecyclerView.ViewHolder {
           ImageView itemImage;
           TextView itemName;
    
           public ViewHoder(View view) {
               super(view);
               itemImage = (ImageView)view.findViewById(R.id.item_image);
               itemName = (TextView)view.findViewById(R.id.item_name);
           }
       }
    
       public ItemAdapter(List<Item> itemList) {
           this.mItemList = itemList;
       }
    
       /**
        * 创建ViewHoder实例
        * @param parent
        * @param viewType
        * @return
        */
       @Override
       public ViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {
           // 使用自定义布局创建子项视图
           View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
           ViewHoder hoder = new ViewHoder(view);
           return hoder;
       }
    
       /**
        * 对子项进行设置值
        * @param holder
        * @param position
        */
       @Override
       public void onBindViewHolder(ViewHoder holder, int position) {
           Item item = mItemList.get(position);
           holder.itemImage.setImageResource(item.getImageId());
           holder.itemName.setText(item.getName());
       }
    
       /**
        * 返回项目数量
        * @return
        */
       @Override
       public int getItemCount() {
           return mItemList.size();
       }
    }
  5. 在活动中使用RecyclerView

       private List<Item> itemList= new ArrayList<>();
    
       @Override
       protected void onCreate(Bundle savedInstanceState) {
           super.onCreate(savedInstanceState);
           setContentView(R.layout.activity_main);
           initItems();
           RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
           LinearLayoutManager layoutManager = new LinearLayoutManager(this);
           recyclerView.setLayoutManager(layoutManager);
           ItemAdapter adapter = new ItemAdapter(itemList);
           recyclerView.setAdapter(adapter);
       }
    
       private void initItems() {
           for(int i = 0; i < 3; i ++) {
               itemList.add(new Item("Apple", R.drawable.apple_pic));
               itemList.add(new Item("Banana", R.drawable.banana_pic));
               itemList.add(new Item("Orange", R.drawable.orange_pic));
               itemList.add(new Item("Watermelon", R.drawable.watermelon_pic));
               itemList.add(new Item("Pear", R.drawable.pear_pic));
               itemList.add(new Item("Grape", R.drawable.grape_pic));
               itemList.add(new Item("Pineapple", R.drawable.pineapple_pic));
               itemList.add(new Item("Strawberry", R.drawable.strawberry_pic));
               itemList.add(new Item("Cherry", R.drawable.cherry_pic));
               itemList.add(new Item("Mango", R.drawable.mango_pic));
           }
       }

RecyclerView实现横向滚动

数据项布局:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="100dp"
    android:layout_height="wrap_content">

    <ImageView
        android:id="@+id/item_image"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"/>

    <TextView
        android:id="@+id/item_name"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center_horizontal"
        android:layout_marginTop="10dp" />

</LinearLayout>

将LinearLayout排列方向改为vertical垂直方向,并且设置宽度,布局下面的子项都设置成水平居中。

活动中:

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        initItems();
        RecyclerView recyclerView = (RecyclerView)findViewById(R.id.recycler_view);
        LinearLayoutManager layoutManager = new LinearLayoutManager(this);
        layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
        recyclerView.setLayoutManager(layoutManager);
        ItemAdapter adapter = new ItemAdapter(itemList);
        recyclerView.setAdapter(adapter);
    }

增加layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL),这样就实现RecyclerView横向滚动。

RecyclerView点击事件

public class ItemAdapter extends RecyclerView.Adapter<ItemAdapter.ViewHoder> {
    List<Item> mItemList;

    static class ViewHoder extends RecyclerView.ViewHolder {
        View itemView;
        ImageView itemImage;
        TextView itemName;

        public ViewHoder(View view) {
            super(view);
            itemView = view;
            itemImage = (ImageView)view.findViewById(R.id.item_image);
            itemName = (TextView)view.findViewById(R.id.item_name);
        }
    }

    public ItemAdapter(List<Item> itemList) {
        this.mItemList = itemList;
    }

    /**
     * 创建ViewHoder实例
     * @param parent
     * @param viewType
     * @return
     */
    @Override
    public ViewHoder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(parent.getContext()).inflate(R.layout.item_layout, parent, false);
        final ViewHoder hoder = new ViewHoder(view);
        hoder.itemView.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = hoder.getAdapterPosition();
                Item item = mItemList.get(position);
                Toast.makeText(v.getContext(), "Click View:" + item.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        hoder.itemImage.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                int position = hoder.getAdapterPosition();
                Item item = mItemList.get(position);
                Toast.makeText(v.getContext(), "Click Image:" + item.getName(), Toast.LENGTH_SHORT).show();
            }
        });
        return hoder;
    }

    /**
     * 对子项进行设置值
     * @param holder
     * @param position
     */
    @Override
    public void onBindViewHolder(ViewHoder holder, int position) {
        Item item = mItemList.get(position);
        holder.itemImage.setImageResource(item.getImageId());
        holder.itemName.setText(item.getName());
    }

    /**
     * 返回项目数量
     * @return
     */
    @Override
    public int getItemCount() {
        return mItemList.size();
    }
}

参考内容:

  • 《Android第一行代码(第2版)》

标签: android

添加新评论