android5.0新特性 ToolBar+RecycleView的使用

本文内容主要由慕课网 http://www.imooc.com/video/8187 视频整理出(文章链接http://blog.csdn.net/lmj623565791/article/details/45059587)



如图,这个demo主要是用实现RecycleView实现瀑布流,使用ToolBar实现向瀑布流中添加或删除Item的按钮。同时熟悉这两个新控件的使用。


<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:orientation="vertical">

    <android.support.v7.widget.Toolbar
        android:id="@+id/tool_bar"
        android:layout_width="match_parent"
        android:background="?attr/colorPrimary"
        android:layout_height="?attr/actionBarSize">
    </android.support.v7.widget.Toolbar>

    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycle_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
    </android.support.v7.widget.RecyclerView>

</LinearLayout>

主布局中直接写了这两个控件。


首先说使用ToolBar的注意点。来看一下清单文件AndroidMainifest.xml

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="com.example.yin.recycleview">

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity
            android:name=".MainActivity"
            android:theme="@style/AppTheme.NoActionBar">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
    </application>

</manifest>

可以看到我们给Activity单独使用了一个AppTheme.NoActionBar主题。

具体的点进@style资源里看一看

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>
    </style>

    <style name="AppTheme.NoActionBar" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:textColorPrimary">@android:color/white</item>
        <item name="colorPrimary">@color/colorPrimary</item>
    </style>

</resources>

发现我们的AppTheme.NoActionBar是继承了一个Theme.AppCompat.Light.NoActionBar主题,另外自己设置了标题栏文字的颜色和标题栏背景色。

原因就是要使用ToolBar必须要先取消ActionBar的出现,我们可以选择直接将application的主题设置为NoActionBar的,或者单独将需要显示ToolBar的activity设置为NoActionBar的。这里我用了后面一种。


public class MainActivity extends AppCompatActivity {

    private RecyclerView recyclerView;
    private List<String>mString;
    MyRecycleAdapter myRecycleAdapter;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        /*初始化RecycleView相关内容*/
        initRecycleView();
        Toolbar toolbar = (Toolbar) findViewById(R.id.tool_bar);
        setSupportActionBar(toolbar);
        /*不显示默认的Title,自己指定标题*/
        getSupportActionBar().setDisplayShowTitleEnabled(false);
        toolbar.setTitle("test");
        /*设置ToolBar最左侧的导航图标*/
        toolbar.setNavigationIcon(R.mipmap.ic_launcher);
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.setting:
                Toast.makeText(this, "setting", Toast.LENGTH_SHORT).show();
                return true;
            case R.id.add:
                addItem(1);
                return true;
            case R.id.delete:
                deleteItem(1);
                return true;
            case android.R.id.home:
                Toast.makeText(this, "back", Toast.LENGTH_SHORT).show();
        }
        return super.onOptionsItemSelected(item);
    }

    private void addItem(int position) {
        /*数据源指定位置添加数据*/
        mString.add(position, "test");
        /*利用notifyItemInserted(position)通知Adapter进行更新。这个方法会将数组的position位置的
        数据添加显示到对应的position位置,原来的position以及之后的Item都向后移动一位。
        (这里如果用myRecycleAdapter.notifyDataSetChanged()能更新数据,但是不触发动画)*/
        myRecycleAdapter.notifyItemInserted(position);
        /*由于瀑布流每个Item的高度是用一个heights数组设定的,所以Item添加后,
        要对heights数组也进行添加,否则会产生数组越界异常*/
        myRecycleAdapter.addHeight(position);
    }

    private void deleteItem(int position) {
        mString.remove(position);
        myRecycleAdapter.notifyItemRemoved(position);
        myRecycleAdapter.deleteHeight(position);
    }

    private void initRecycleView() {
        recyclerView = (RecyclerView) findViewById(R.id.recycle_view);
        mString = new ArrayList<>();
        for (int i = 'A';i<'z';i++){
            mString.add((char)i+"");
        }

        /*普通ListView效果
        recyclerView.setLayoutManager(new LinearLayoutManager(this));*/
        /*列数为4的表格布局
        recyclerView.setLayoutManager(new GridLayoutManager(this,4));*/
        /*行数为4的横向滑动的表格布局
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.HORIZONTAL));*/

        /*列数为4的纵向表格布局,当附加设置了每个子View高度随机时,就形成瀑布流效果*/
        recyclerView.setLayoutManager(new StaggeredGridLayoutManager(4,StaggeredGridLayoutManager.VERTICAL));
        myRecycleAdapter = new MyRecycleAdapter(this, R.layout.item_string, mString);
        recyclerView.setAdapter(myRecycleAdapter);
        /*为recycleView指定Item动画(事实上默认使用的就是这个体统提供的默认动画)*/
        recyclerView.setItemAnimator(new DefaultItemAnimator());
    }
}

在主布局中声明了ToolBar和RecycleView以及适配器。ToolBar中的点击菜单在R.menu.menu中定义,然后直接在onCreateOptionsMenu()方法中加载进来。

<menu xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto">

    <item
        android:id="@+id/setting"
        app:showAsAction="never"
        android:title="setting"/>

    <item
        android:id="@+id/add"
        app:showAsAction="ifRoom"
        android:icon="@drawable/ic_add_circle_outline_white_48dp"
        android:title="add"/>
    <item
        android:id="@+id/delete"
        app:showAsAction="ifRoom"
        android:icon="@drawable/ic_remove_circle_outline_white_48dp"
        android:title="delete"/>

</menu>


再来看看自定义的Adapter

/*RecycleView的Adapter强制要求开发者使用ViewHolder模式*/
public class MyRecycleAdapter extends RecyclerView.Adapter<MyRecycleAdapter.MyViewHolder> {

    private Context context;
    private List<String>datas;
    private int resourceId;
    private List<Integer>heights;

    public MyRecycleAdapter(Context context,int resourceId,List<String>datas){
        this.datas = datas;
        this.context = context;
        this.resourceId = resourceId;
        /*后面用来动态设置每个子View的高度*/
        heights = new ArrayList<>();
        for (int i = 0;i<datas.size();i++){
            heights.add(new Random().nextInt(200)+100);
        }
    }

    public void deleteHeight(int position) {
        /*删除Item后,对应的高度数据也从数组中删除*/
        heights.remove(position);
    }

    public void addHeight(int position) {
        /*在数组相应位置添加一个随机数作为添加的Item的高度*/
        heights.add(position,new Random().nextInt(200)+100);
    }

    @Override
    public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = (LayoutInflater.from(context)).inflate(resourceId, parent, false);
        return new MyViewHolder(view);
    }

    @Override
    public void onBindViewHolder(MyViewHolder holder, int position) {
        /*动态设置每个子View的高度,产生瀑布流效果*/
        ViewGroup.LayoutParams lp = holder.itemView.getLayoutParams();
        lp.height = heights.get(position);
        holder.itemView.setLayoutParams(lp);
        holder.textView.setText(datas.get(position));
    }

    @Override
    public int getItemCount() {
        return datas.size();
    }

    class MyViewHolder extends RecyclerView.ViewHolder{
        public TextView textView;
        public MyViewHolder(View itemView) {
            super(itemView);
            textView = (TextView) itemView.findViewById(R.id.id_text);
        }
    }
}

可以看到RecycleView的Adapter强制性的要求开发者使用ViewHolder模式,所以我们一开始就创建了一个继承自RecycleView.ViewHolder的内部类,剩下的跟传统的ListView使用差不多。值得注意的是由于我们要实现瀑布流效果,所以还定义了一个List用来存储每个Item的高度。而且当添加和删除Item后也要更新List的内容。
本文内容主要由慕课网 http://www.imooc.com/video/8187 视频整理出(文章链接http://blog.csdn.net/lmj623565791/article/details/45059587)
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值