學會使用RecyclerView 及Arrays.asList函數
來源:程序員人生 發布時間:2015-03-12 09:01:09 閱讀次數:2821次
要實現ListView列表的循環轉動效果,其實可以用RecyclerView實現。
Runnable run = new Runnable() {
@Override
public void run() {
// String str = "abc";
// datas.add(str);
// mRecyclerAdapter.notifyItemInserted(1);
datas.remove(curPos);
mRecyclerAdapter.notifyItemRemoved(curPos);
curPos --;
handler.sendEmptyMessage(0);
}
};
布局文件中使用 RecyclerView,橫向和縱向兩個:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical"
tools:context=".MyActivity">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Horizontal"
android:textSize="18sp" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_horizontal"
android:layout_width="match_parent"
android:layout_height="50dp"
android:scrollbars="horizontal" />
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:text="Vertical"
android:textSize="18sp" />
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerview_vertical"
android:layout_width="match_parent"
android:layout_height="0dp"
android:layout_weight="1"
android:scrollbars="vertical" />
</LinearLayout>
Activity中
package com.baoyz.recyclerviewdemo;
import android.app.Activity;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.Menu;
import android.view.MenuItem;
public class MyActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_my);
initHorizaontal();
initVertical();
}
private void initHorizaontal() {
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview_horizontal);
// 創建1個線性布局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
layoutManager.setOrientation(LinearLayoutManager.HORIZONTAL);
// 設置布局管理器
recyclerView.setLayoutManager(layoutManager);
// 創建數據集
String[] dataset = new String[100];
for (int i = 0; i < dataset.length; i++){
dataset[i] = "item" + i;
}
// 創建Adapter,并指定數據集
MyAdapter adapter = new MyAdapter(dataset);
// 設置Adapter
recyclerView.setAdapter(adapter);
}
public void initVertical(){
RecyclerView recyclerView = (RecyclerView) findViewById(R.id.recyclerview_vertical);
// 創建1個線性布局管理器
LinearLayoutManager layoutManager = new LinearLayoutManager(this);
// 默許是Vertical,可以不寫
layoutManager.setOrientation(LinearLayoutManager.VERTICAL);
// 設置布局管理器
recyclerView.setLayoutManager(layoutManager);
// 創建數據集
String[] dataset = new String[100];
for (int i = 0; i < dataset.length; i++){
dataset[i] = "item" + i;
}
// 創建Adapter,并指定數據集
MyAdapter adapter = new MyAdapter(dataset);
// 設置Adapter
recyclerView.setAdapter(adapter);
}
}
RecyclerView 1個特點就是,將 layout 抽象成了1個 LayoutManager,RecylerView 不負責子 View 的布局, 我們可以自定義 LayoutManager 來實現不同的布局效果, 目前只提供了LinearLayoutManager。
LinearLayoutManager 可以指定方向,默許是垂直, 可以指定水平, 這樣就輕松實現了水平的 ListView。
Adapter
package com.baoyz.recyclerviewdemo;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
/**
* Created by baoyz on 2014/6/29.
*/
public class MyAdapter extends RecyclerView.Adapter<MyAdapter.ViewHolder>{
// 數據集
private String[] mDataset;
public MyAdapter(String[] dataset) {
super();
mDataset = dataset;
}
@Override
public ViewHolder onCreateViewHolder(ViewGroup viewGroup, int i) {
// 創建1個View,簡單起見直接使用系統提供的布局,就是1個TextView
View view = View.inflate(viewGroup.getContext(), android.R.layout.simple_list_item_1, null);
// 創建1個ViewHolder
ViewHolder holder = new ViewHolder(view);
return holder;
}
@Override
public void onBindViewHolder(ViewHolder viewHolder, int i) {
// 綁定數據到ViewHolder上
viewHolder.mTextView.setText(mDataset[i]);
}
@Override
public int getItemCount() {
return mDataset.length;
}
public static class ViewHolder extends RecyclerView.ViewHolder{
public TextView mTextView;
public ViewHolder(View itemView) {
super(itemView);
mTextView = (TextView) itemView;
}
}
}
RecyclerView 的另外一個特點是標準化了 ViewHolder, 編寫 Adapter 面向的是 ViewHoder 而不在是View 了, 復用的邏輯被封裝了, 寫起來更加簡單。
慚愧,使用Arrays.as(String[])方法不當,調試半天不知道哪錯了:
試運行以下代碼,你猜會出現甚么情況。
public static void main(String[] args){
String[] strs={"1","2","3","4"};
System.out.println(Arrays.asList(strs).remove(0));
}
如果沒有沒錯,你1般會說是:1。但是實際上返回的是:
Exception in thread "main" java.lang.UnsupportedOperationException
at java.util.AbstractList.remove(AbstractList.java:144)
at com.lmax.disruptor.YieldingWaitStrategy.main(YieldingWaitStrategy.java:126)
為何會出現這類情況?由于我們認為JDK會返回1個ArrayList或LinkedList,所直接調用remove(int index)方法。實際上asList返回的時甚么呢?asList返回的是Arrays類內部自定義的AbstractList的子類,它沒有實現remove方法。
如何避免這類情況產生呢?
public static void main(String[] args){
String[] strs={"1","2","3","4"};
System.out.println(new LinkedList<String>(Arrays.asList(strs)).remove(0));
}
生活不易,碼農辛苦
如果您覺得本網站對您的學習有所幫助,可以手機掃描二維碼進行捐贈