您的位置:首页 > 移动开发 > Android开发

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的按钮。同时熟悉这两个新控件的使用。

<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)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  RecycleView ToolBar