android5.0新特性 ToolBar+RecycleView的使用
2016-03-13 20:42
471 查看
本文内容主要由慕课网 http://www.imooc.com/video/8187 视频整理出(文章链接http://blog.csdn.net/lmj623565791/article/details/45059587)
如图,这个demo主要是用实现RecycleView实现瀑布流,使用ToolBar实现向瀑布流中添加或删除Item的按钮。同时熟悉这两个新控件的使用。
主布局中直接写了这两个控件。
首先说使用ToolBar的注意点。来看一下清单文件AndroidMainifest.xml
可以看到我们给Activity单独使用了一个AppTheme.NoActionBar主题。
具体的点进@style资源里看一看
发现我们的AppTheme.NoActionBar是继承了一个Theme.AppCompat.Light.NoActionBar主题,另外自己设置了标题栏文字的颜色和标题栏背景色。
原因就是要使用ToolBar必须要先取消ActionBar的出现,我们可以选择直接将application的主题设置为NoActionBar的,或者单独将需要显示ToolBar的activity设置为NoActionBar的。这里我用了后面一种。
在主布局中声明了ToolBar和RecycleView以及适配器。ToolBar中的点击菜单在R.menu.menu中定义,然后直接在onCreateOptionsMenu()方法中加载进来。
再来看看自定义的Adapter
可以看到RecycleView的Adapter强制性的要求开发者使用ViewHolder模式,所以我们一开始就创建了一个继承自RecycleView.ViewHolder的内部类,剩下的跟传统的ListView使用差不多。值得注意的是由于我们要实现瀑布流效果,所以还定义了一个List用来存储每个Item的高度。而且当添加和删除Item后也要更新List的内容。
本文内容主要由慕课网 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)
相关文章推荐
- Android 5.0新特性ToolBar
- 创建提示风格的工具条jQuery插件_Toolbar.Js
- CoordinatorLayout与滚动的处理
- MFC Toolbar图标尺寸调整出错解决方法
- android toolbar
- 怎样在键盘上添加工具栏
- Ext动态修改girdPanel上的ToolBar的Text
- jquery 实现toolbar与网页浮动工具条jQuery实现方法
- 仿Google相册的侧滑栏效果(DrawerLayout Toolbar)
- Android添加新版本支持包V7后自定义ActionBar左侧有空白,不能完全填充问题解决
- MaterialDesign 之 ToolBar学习
- Toolbar的高级使用
- 欢迎使用CSDN-markdown编辑器
- Toolbar的各种使用方法
- Toolbar + drawerlayout 实现侧滑菜单
- 【Android-RecyclerView】瀑布流实现
- CoordinatorLayout 之 AppBarLayout
- Toolbar使用方法
- Android中toolbar的简单使用
- 工具条