Android RecyclerView初探

 

原文:https://github.com/dyguests/RecyclerViewDemojava

 

RecyclerView是用於替換ListView的解決方案,將視圖控制和數據綁定作了分離,提供了強大的樣式定製能力android

 

使用教程

1.準備工做

在 module 的 build.gradle 中 加入 compile 'com.android.support:recyclerview-v7:23.3.0' 代碼:git

dependencies {
    ...
    compile 'com.android.support:recyclerview-v7:23.3.0'//1.1
    ...
}

2.使用RecyclerView

2.1.在xml中添加RecyclerView

activity_linear_layout_manager.xmlgithub

<RelativeLayout
    ...>
    <android.support.v7.widget.RecyclerView
        android:id="@+id/recycler_view"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:listitem="@layout/item_linear"/>
</RelativeLayout>

 

注:tools:listitem="@layout/item_linear"是用於在Android Studio的Preview中查看效果用的ide

2.2.在java中添加RecyclerView

LinearLayoutManagerActivity.java佈局

2.2.1.綁定

mRecyclerView = ((RecyclerView) findViewById(R.id.recycler_view));gradle

2.2.2.添加LayoutManager(佈局方式)

mRecyclerView.setLayoutManager(new LinearLayoutManager(this,
                LinearLayoutManager.VERTICAL/*方向*/,
                false/*是否反向*/
        ));

注:這裏用LinearLayoutManager表示這是使用線性佈局,也能夠使用GridLayoutManager等.動畫

2.2.3.綁定Adapter(參考 2.3.建立Adapter)

mAdapter = new LinearLayoutManagerAdapter(this);
        mRecyclerView.setAdapter(mAdapter);

2.2.4.添加數據

...
mAdapter.addItem(user);
...

也能夠使用ui

...
mAdapter.addItems(users);
...

注:addItem(),addItems()方法是自定義的,主要是爲了把數據添加操做和動畫放在一塊兒.this

2.3.建立Adapter

2.3.1.建立LinearLayoutManagerAdapter

public class LinearLayoutManagerAdapter{

}

2.3.2.讓類繼承RecyclerView.Adapter

public class LinearLayoutManagerAdapter extends RecyclerView.Adapter{

}

2.3.3.注意,RecyclerView.Adapter是泛型類,須要一個繼承至RecyclerView.ViewHolder的泛型參數(?),這裏咱們建立一個ViewHolder的內部類:

public class LinearLayoutManagerAdapter extends RecyclerView.Adapter{

    public class ViewHolder extends RecyclerView.ViewHolder{

    }
}

2.3.4.添加泛型聲明

public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{

    public class ViewHolder extends RecyclerView.ViewHolder{

    }
}

2.3.5.實現方法

public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{

    @Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        return null;
    }

    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {

    }

    @Override
    public int getItemCount() {
        return 0;
    }

    public class ViewHolder extends RecyclerView.ViewHolder{

        public ViewHolder(View itemView) {
            super(itemView);
        }
    }
}

 

2.3.6.添加構造器

public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{

    private final Context context;

    public LinearLayoutManagerAdapter(Context context) {
        this.context = context;
    }

    ...
}

 

2.3.7.指定item_view,注意這裏與ListView不一樣,這裏不返回View,而是返回ViewHolder(自已定義的).

@Override
    public ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        View view = LayoutInflater.from(context).inflate(R.layout.item_linear, parent, false);
        return new ViewHolder(view);
    }

 

2.3.8.添加數據源

public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{
    ...
    private final ArrayList<User> list;


    public LinearLayoutManagerAdapter(Context context) {
        this.context = context;
        list = new ArrayList<>();
    }
    ...
    @Override
    public int getItemCount() {
        return list.size();
    }
    ...
}

 

2.3.9.實現list_item與數據的綁定

public class LinearLayoutManagerAdapter extends RecyclerView.Adapter<LinearLayoutManagerAdapter.ViewHolder>{
    ...
    @Override
    public void onBindViewHolder(ViewHolder holder, int position) {
        holder.bind(list.get(position));
    }
    ...
    public class ViewHolder extends RecyclerView.ViewHolder{
        ...
        public void bind(User data) {
        }
    }
}

 

2.3.10.在ViewHolder中實現佈局元素的綁定與數據的綁定

public class ViewHolder extends RecyclerView.ViewHolder {
        private final TextView mTextView;
        private       User     data;

        public ViewHolder(View itemView) {
            super(itemView);
            mTextView = ((TextView) itemView.findViewById(R.id.text_view));
        }

        public void bind(User data) {
            mTextView.setText(data.getName());

            this.data = data;
        }
    }

 

這裏注意一下,請儘可能把ViewHolder相關的佈局元素綁定,數據綁定放到ViewHolder中來實現,而不要放到onCreateViewHolder(),onBindViewHolder()中去實現.

2.3.11.其它相關代碼

    //-----------------------數據增刪相關-------------------------------

    public void addItem(User item) {
        int positionStart = list.size();
        list.add(item);
        notifyItemInserted(positionStart);
    }

    public void addItems(List<User> items) {
        int positionStart = list.size();
        list.addAll(items);
        notifyItemRangeInserted(positionStart, items.size());
    }

    public void clear() {
        int itemCount = list.size();
        list.clear();
        notifyItemRangeRemoved(0, itemCount);
    }

 

注:這段代碼是爲了方便把數據增刪和動畫效果綁定要一塊兒

3.其它幾種例子

LinearLayoutManagerActivity

GridLayoutManagerActivity

InContainerActivity

相關文章
相關標籤/搜索