天天看點

RecyclerView的使用方法和瀑布流的實作RecyclerView的功能十分強大,通過一個RecyclerView可以變換成為listview、gridview、瀑布流,下面就詳細介紹一個RecyclerView的具體使用方法 項目示例截圖:

RecyclerView的功能十分強大,通過一個RecyclerView可以變換成為listview、gridview、瀑布流,下面就詳細介紹一個RecyclerView的具體使用方法

項目示例截圖:

RecyclerView的使用方法和瀑布流的實作RecyclerView的功能十分強大,通過一個RecyclerView可以變換成為listview、gridview、瀑布流,下面就詳細介紹一個RecyclerView的具體使用方法 項目示例截圖:

1、首先找到RecyclerView的一個jar包,這個jar包要和你的sdk版本盡量是一緻的,要不然有可能會出現找不到資源的錯誤,jar包路徑在

..\sdk\extras\android\support\v7\recyclerview\libs(sdk安裝路徑下的檔案夾)
           

找到jar包之後可以直接拷貝到項目的libs檔案下,然後就可以使用RecyclerView了

2、建立布局檔案,示例中的布局檔案隻放置了一個RecyclerView,代碼如下

(注意:要使用<android.support.v7.widget.RecyclerView>聲明)

<RelativeLayout 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"
    tools:context="com.example.recyclerviewdemo.MainActivity" >

    <<span style="color:#ff6666;">android.support.v7.widget.RecyclerView</span>
        android:id="@+id/recyclerview"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

</RelativeLayout>
           

3、為RecyclerView的每一個item設定一個布局,這裡就簡單的使用一個TextView來充當item,内容設定為wrap_content

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="#ffcc00"
    android:layout_margin="5dp"
    tools:context="com.example.recyclerviewdemo.MainActivity" >

    <TextView
        android:id="@+id/textView1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:text="TextView" />

</RelativeLayout>
           

4、為RecyclerView設定一個Adapter來實作資料和視圖的一個綁定

(RecyclerView的adapter需要繼承RecyclerView.Adapter<MyViewholder>這裡的MyViewholder是重寫的一個Viewholder,RecyclerView的adapter必須結合Viewholder來使用,這對布局的優化起了很大的作用)

RecyclerView的adapter主要有兩個方法和一個Viewholder類組成

a、onCreateViewHolder方法,主要是實作把布局檔案執行個體化出來,然後放進我們的Viewholder内部類中進行控件的執行個體化

public MyViewholder onCreateViewHolder(ViewGroup arg0, int arg1) {
		// TODO Auto-generated method stub
		View view = inflater.inflate(R.layout.item, arg0, false);
		MyViewholder myViewholder = new MyViewholder(view);
		return myViewholder;
	}
           

b、onBindViewHolder方法,主要是将資料和我們的控件綁定在一起,實作資料綁定

public void onBindViewHolder(final MyViewholder arg0, int arg1) {
		// TODO Auto-generated method stub
		arg0.textView.setText(list.get(arg1));

	}
           

c、ViewHolder内部類,這裡我們重寫了一個MyViewholder内部類,繼承了Viewholder,實作控件的執行個體化

class MyViewholder extends ViewHolder {
	TextView textView;
	public MyViewholder(View arg0) {
		super(arg0);
		textView = (TextView) arg0.findViewById(R.id.textView1);
	}
}
           

通過上面幾個方法的完成,我們就可以将資料通過構造方法傳入adapter中,實作資料和視圖的綁定

5、在MainActivity中,我們需要執行個體化我們的adapter和RecyclerView

控件的執行個體化和平時一樣,主要講一下RecyclerView和listveiw等不同的點,RecyclerView主要是通過LayoutManager來進行管理的,通過LayoutManager來實作不同的樣式,下面我們來分别介紹一下,通過RecyclerView來實作listview和gridview和瀑布流三種樣式

a、實作listview功能

通過使用LinearLayoutManager我們可以實作listveiw的樣式

LinearLayoutManager layoutManager = new LinearLayoutManager(this, LinearLayoutManager.VERTICAL, false);
recyclerView.setLayoutManager(layoutManager);
           

這裡是設定了一個垂直方向的listview

b、通過使用GridLayoutManager我們可以實作GridView樣式

recyclerView.setLayoutManager(new GridLayoutManager(this, 3,GridLayoutManager.HORIZONTAL, false));
           

上面參數表示了分3列顯示資料,方向為水準方向

c、通過使用StaggeredGridLayoutManager我們可以實作瀑布流樣式

recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,StaggeredGridLayoutManager.VERTICAL));
           

通過上面簡單的設定我們就可以實作不同的顯示樣式,方法非常簡單

6、上面已經介紹了比較核心的使用代碼,下面把項目的源碼釋出一下

6.1  MainActivity代碼

public class MainActivity extends ActionBarActivity {

	private RecyclerView recyclerView;
	private List<String> lists;
	private MyAdapter mAdapter;

	@Override
	protected void onCreate(Bundle savedInstanceState) {
		super.onCreate(savedInstanceState);
		setContentView(R.layout.activity_main);
		initData();
		initView();
	}
	//
	private void initView() {
		// TODO Auto-generated method stub
		recyclerView = (RecyclerView) findViewById(R.id.recyclerview);
		recyclerView.setAdapter(mAdapter);
		LinearLayoutManager layoutManager = new LinearLayoutManager(
				getApplicationContext(), LinearLayoutManager.VERTICAL, false);
		recyclerView.setLayoutManager(layoutManager);
                //此處是為了添加一個分隔線
		// recyclerView.addItemDecoration(new DividerItemDecoration(
		// getApplicationContext(), DividerItemDecoration.VERTICAL_LIST));
	}
	private void initData() {
		// TODO Auto-generated method stub

		lists = new ArrayList<String>();

		for (int i = 0; i < 20; i++) {
			if (i % 2 == 0) {
				lists.add("ggggggggggggggggffffffffffffffggggggggggggggggffffffffffffffggggggggggggggggfffffffffffffffffffffffffkkkkk"
						+ i);
			} else {
				lists.add("gggggggggggggggg" + i);
			}
		}

		mAdapter = new MyAdapter(getApplicationContext(), lists);
	}

	@Override
	public boolean onCreateOptionsMenu(Menu menu) {
		// TODO Auto-generated method stub
		getMenuInflater().inflate(R.menu.main, menu);
		return true;
	}

	@Override
	public boolean onOptionsItemSelected(MenuItem item) {
		// TODO Auto-generated method stub

		switch (item.getItemId()) {
		case R.id.listview:
			recyclerView.setLayoutManager(new LinearLayoutManager(this,
					LinearLayoutManager.VERTICAL, false));
			break;
		case R.id.gridview:
			recyclerView.setLayoutManager(new GridLayoutManager(this, 3));
			break;
		case R.id.horizengridview:
			recyclerView.setLayoutManager(new GridLayoutManager(this, 2,
					GridLayoutManager.HORIZONTAL, false));
			break;
		case R.id.pubuliu:
			recyclerView.setLayoutManager(new StaggeredGridLayoutManager(3,
					StaggeredGridLayoutManager.VERTICAL));
			break;
		case R.id.add:
			mAdapter.add(1);
			break;
		case R.id.delete:
			mAdapter.delete(1);
			break;
		}

		return true;
	}
}
           

6.2  MyAdapter代碼

public class MyAdapter extends RecyclerView.Adapter<MyViewholder> {

	private LayoutInflater inflater;
	private Context context;
	private List<String> list;
	public MyAdapter(Context context, List<String> list) {
		// TODO Auto-generated constructor stub
		this.context = context;
		this.list = list;
		inflater = LayoutInflater.from(context);
	}

	@Override
	public int getItemCount() {
		// TODO Auto-generated method stub
		return list.size();
	}

	@Override
	public void onBindViewHolder(final MyViewholder arg0, int arg1) {
		// TODO Auto-generated method stub
		arg0.textView.setText(list.get(arg1));
	}

	@Override
	public MyViewholder onCreateViewHolder(ViewGroup arg0, int arg1) {
		// TODO Auto-generated method stub

		View view = inflater.inflate(R.layout.item, arg0, false);

		MyViewholder myViewholder = new MyViewholder(view);
		return myViewholder;
	}

	public void add(int pos) {
		list.add(pos, "插入新的");
		this.notifyItemInserted(pos);
	}

	public void delete(int pos) {
		list.remove(pos);
		this.notifyItemRemoved(pos);
	}

}

class MyViewholder extends ViewHolder {

	TextView textView;

	public MyViewholder(View arg0) {
		super(arg0);
		// TODO Auto-generated constructor stub
		textView = (TextView) arg0.findViewById(R.id.textView1);
	}

}
           

7、注意:本示例,RecyclerView無法響應單擊事件,下個博文會介紹怎麼給RecyclerView添加單擊響應事件,請檢視下一個博文

繼續閱讀