RecyclerView 기본 사용 노트
1. RecyclerView의 기본 사용
1. RecyclerView의 소개RecyclerView는support-V7보의 컨트롤로ListView,GridView 등을 대체하는 데 사용된다.다음은 공식적인 해석이다.
RecyclerView is a more advanced and flexible version of ListView. This widget is a container for large sets of views that can be recycled and scrolled very efficiently. Use the RecyclerView widget when you have lists with elements that change dynamically. 사실 item을 동적으로 보여줄 필요가 있을 때 RecyclerView를 사용하는 것을 권장합니다.
2. RecyclerView 사용
dependencies {
compile fileTree(include: ['*.jar'], dir: 'libs')
testCompile 'junit:junit:4.12'
compile 'com.android.support:appcompat-v7:23.4.0'
compile 'com.android.support:recyclerview-v7:23.4.0'// RecyclerView
}
내가 사용하는 안드로이드 스튜디오는 일반적으로 다음과 같은 절차로 인용을 추가합니다: File → Project Structure 왼쪽에서 대응하는 Moudle을 선택하고 오른쪽에서 Dependences →add → Library Dependece를 선택한 다음 대응하는 가방을 찾아서 추가하십시오.
布局文件很简单,上面两个按钮,下面一个RecyclerView。
3.然后在代码中对RecyclerView进行使用,一般需要做以下设置:
public class NormalActivity extends AppCompatActivity implements View.OnClickListener {
private RecyclerView mRecyclerView;
private List mDatas;
private HomeAdapter adapter;
private Button insertBtn,removeBtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_normal);
insertBtn = (Button) findViewById(R.id.insertBtn);
removeBtn = (Button) findViewById(R.id.removeBtn);
insertBtn.setOnClickListener(this);
removeBtn.setOnClickListener(this);
mDatas = this.getIntent().getStringArrayListExtra("data");
// RecyclerView
mRecyclerView = (RecyclerView) findViewById(R.id.id_normal_recyclerview);
// RecyclerView
mRecyclerView.setLayoutManager(new LinearLayoutManager(this));
// RecyclerView Adapter
adapter = new HomeAdapter(this, mDatas);
mRecyclerView.setAdapter(adapter);
// RecyclerView ( DividerItemDecoration , )
mRecyclerView.addItemDecoration(new DividerItemDecoration(this,DividerItemDecoration.HORIZONTAL_LIST));
//
mRecyclerView.setItemAnimator(new DefaultItemAnimator());
}
@Override
public void onClick(View view) {
switch (view.getId()){
case R.id.insertBtn:
adapter.addData(1);
break;
case R.id.removeBtn:
adapter.removeData(1);
break;
}
}
}
RecyclerView를 사용하려면 일반적으로 레이아웃 관리자, 어댑터, 분할선, 애니메이션을 설정해야 합니다.
주로 레이아웃 관리자에 대해 말하자면 모두 세 가지가 있는데 그것이 바로 LinearLayoutManager(선형 레이아웃), GridLayoutManager(격자 레이아웃), StaggeredGridLayoutManager(폭포류 레이아웃)이다.
그런 다음 HomeAdapter의 내용을 살펴보십시오.
public class HomeAdapter extends RecyclerView.Adapter{
private List mDatas;
private LayoutInflater mInflater;
/**
* Adapter , , :LayoutInflater、data
* @param mInflaters Context, LayoutInflater
* @param mDatas RecyclerView
*/
public HomeAdapter(Context context, List mDatas){
this.mDatas = mDatas;
mInflater = LayoutInflater.from(context);
}
/**
* ViewHolder
* @param parent
* @param viewType item ViewHolder
* @return
*/
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
/**
* LayoutInflater.from(MainActivity.this) inflater, fragment
*/
MyViewHolder holder = new MyViewHolder(mInflater.inflate(R.layout.item_normal, parent, false));
return holder;
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.tv.setText(mDatas.get(position));
}
/**
* item
*/
@Override
public int getItemCount() {
return mDatas.size();
}
public class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv;
public MyViewHolder(View view){
super(view);
// view MyViewHolder
tv = (TextView) view.findViewById(R.id.id_num);
}
}
public void addData(int position){
mDatas.add(position, "insert");
notifyItemInserted(position);
}
public void removeData(int position){
mDatas.remove(position);
notifyItemRemoved(position);
}
}
이 어댑터는 Recycler View에서 상속되어야 합니다.Adapter 및 추상적인 접근 방식
이러한 유형의 DividerItemDecoration은 분할선을 그리는 데 사용됩니다.
public class DividerItemDecoration extends RecyclerView.ItemDecoration {
private static final int[] ATTRS = new int[]{
android.R.attr.listDivider
};
public static final int HORIZONTAL_LIST = LinearLayoutManager.HORIZONTAL;
public static final int VERTICAL_LIST = LinearLayoutManager.VERTICAL;
private Drawable mDivider;
private int mOrientation;
public DividerItemDecoration(Context context, int orientation) {
final TypedArray a = context.obtainStyledAttributes(ATTRS);
mDivider = a.getDrawable(0);
a.recycle();
setOrientation(orientation);
}
public void setOrientation(int orientation) {
if (orientation != HORIZONTAL_LIST && orientation != VERTICAL_LIST) {
throw new IllegalArgumentException("invalid orientation");
}
mOrientation = orientation;
}
@Override
public void onDraw(Canvas c, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
drawVertical(c, parent);
} else {
drawHorizontal(c, parent);
}
}
public void drawVertical(Canvas c, RecyclerView parent) {
final int left = parent.getPaddingLeft();
final int right = parent.getWidth() - parent.getPaddingRight();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
android.support.v7.widget.RecyclerView v = new android.support.v7.widget.RecyclerView(parent.getContext());
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int top = child.getBottom() + params.bottomMargin;
final int bottom = top + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
public void drawHorizontal(Canvas c, RecyclerView parent) {
final int top = parent.getPaddingTop();
final int bottom = parent.getHeight() - parent.getPaddingBottom();
final int childCount = parent.getChildCount();
for (int i = 0; i < childCount; i++) {
final View child = parent.getChildAt(i);
final RecyclerView.LayoutParams params = (RecyclerView.LayoutParams) child
.getLayoutParams();
final int left = child.getRight() + params.rightMargin;
final int right = left + mDivider.getIntrinsicHeight();
mDivider.setBounds(left, top, right, bottom);
mDivider.draw(c);
}
}
@Override
public void getItemOffsets(Rect outRect, int itemPosition, RecyclerView parent) {
if (mOrientation == VERTICAL_LIST) {
outRect.set(0, 0, 0, mDivider.getIntrinsicHeight());
} else {
outRect.set(0, 0, mDivider.getIntrinsicWidth(), 0);
}
}
}
2. 삽입 삭제 Item
위의 HomeAdapter에서는 다음과 같은 삽입 및 삭제 기능을 사용할 수 있습니다.
public void addData(int position){
mDatas.add(position, "insert");
notifyItemInserted(position);
}
public void removeData(int position){
mDatas.remove(position);
notifyItemRemoved(position);
}
사실 주로 데이터에 대한 삽입 삭제 작업을 한 다음에 인터페이스를 업데이트한다.삽입은 notifyItemInserted()로 삭제하고 notifyItemRemoved()로 삭제합니다. 두 방법 모두 아래 첨자 인자가 필요합니다.
3. Item 클릭 감청
여기서 사실 나는 인터페이스 리셋으로 실현된 것으로 구체적으로 폭포류와 관련된 코드에 나타난다.
RecyclerView의 레이아웃 관리자를 다음과 같이 Staggered Grid LayoutManager로 설정해야 합니다.
mRecycler.setLayoutManager(new StaggeredGridLayoutManager(4, StaggeredGridLayoutManager.VERTICAL));
// ( ),
public class StaggeredAdapter extends RecyclerView.Adapter {
private List mDatas;
private LayoutInflater mInflaters;
private List mHieghts;
private List mWidths;
/**
* Adapter , , :LayoutInflater、data
* @param mInflaters Context, LayoutInflater
* @param mDatas RecyclerView
*/
public StaggeredAdapter(LayoutInflater mInflaters, List mDatas){
this.mInflaters = mInflaters;
this.mDatas = mDatas;
//init heights and width
mHieghts = new ArrayList<>();
for (int i=0; i();
for (int i=0; i position)
{
mDatas.remove(position);
}else {
return;
}
mHieghts.remove(position);
mWidths.remove(position);
notifyItemRemoved(position);
}
/**********************add and remove*************************/
/**********************click listener*************************/
public interface OnItemClickListener{
void onItemClick(View view, int position);
void onItemLongClick(View view, int position);
}
private OnItemClickListener mOnItemClickListener;
public void setmOnItemClickListener(OnItemClickListener onItemClickListener){
mOnItemClickListener = onItemClickListener;
}
/**********************click listener*************************/
}
위의 실현은 사실상 같은 ViewHolder를 사용한 다음에 이 ViewHolder의 레이아웃 파일의 높이를 바꾸어 폭포류와 비슷한 효과를 실현하는 것이다.onCreate View Holder(View Group parent, int view Type)라는 방법을 중점적으로 보십시오. 이 방법은 두 가지 파라미터가 있습니다.두 번째 매개변수는 뷰 유형이며 getItem ViewType(int position)의 반환값입니다.우리는 이 방법을 다시 쓸 수 있다. 서로 다른 데이터에 따라 서로 다른 값을 되돌려주고, 이 값은 매거 유형을 정의할 수 있다. 그리고 ViewHolder를 입을 때 유형에 따라 직접 만들 수 있다.
그 다음에 ViewHolder에서 자주 사용하는 API는 getLayoutPosition()입니다. Item의 아래 첨자를 얻을 수 있습니다.
전반적으로 말하면RecyclerView의 기본적인 용법은 이해했지만 표현이 좀 어지럽다.여기서 총결산을 하고 생각을 정리해 봅시다.그리고 mRecycler View 같아요.addItemDecoration(); mRecyclerView.setItemAnimator();이 두 방법의 용법은 아마도 실제 사용할 때 더욱 깊이 연구해야 할 것이다.그리고 클릭할 때 손가락을 길게 누르고 떠날 때도 클릭 이벤트를 촉발한다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.