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

来源:互联网 发布:js数组转成json字符串 编辑:程序博客网 时间:2024/05/11 15:05

本文内容主要由慕课网 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)
0 0
原创粉丝点击