首先給大家展示下出來的效果:
這裏用linearlayout是需要寫很多累贅的代碼,作爲一個小菜鳥,我是比較習慣於偷懶的。
所以就想到了用recycleview,但是也碰到了很多坑,分享給大家
不bb直接上代碼。
1.導入design包
2.MainActivitiy類,
package com.example.recycleview;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.widget.Toast;
import java.util.ArrayList;
import java.util.List;
/*
* recycleview實現分佈式佈局
* 此處以三種不同的list實現三種不同的佈局
* Created by y.vn on 2016/12/21.
*/
public class MainActivity extends AppCompatActivity {
private RecyclerView recyclerView;
//這裏用的是三個list,一個list也是可以實現上述的效果。但是需要判斷list(position)
private List<String> firstList = new ArrayList<>();
private List<String> secondList = new ArrayList<>();
private List<String> thirdList = new ArrayList<>();
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = (RecyclerView) findViewById(R.id.recycleview);
//控制recycleview高度自適應
recyclerView.setLayoutManager(new FullLinearLayoutManager(this));
initDate();
RecycleViewAdapter recycleViewAdapter = new RecycleViewAdapter(this, firstList, secondList, thirdList);
recyclerView.setAdapter(recycleViewAdapter);
//adapter的點擊事件
recycleViewAdapter.setOnItemListener(new RecycleViewAdapter.OnItemListener() {
@Override
public void onClick(View v, int position) {
Toast.makeText(MainActivity.this, position + "", Toast.LENGTH_SHORT);
}
});
}
//初始化list數據源
private void initDate() {
for (int i = 0; i < 5; i++) {
firstList.add("第一種佈局" + i);
}
for (int i = 5; i < 10; i++) {
secondList.add("第二種佈局" + i);
}
for (int i = 10; i < 16; i++) {
thirdList.add("第三種佈局" + i);
}
}
}
3.FullLinearlayoutManager類
import android.content.Context;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.View;
import android.view.ViewGroup;
/**
* Created by y.vn on 2016/11/30.
*/
public class FullLinearLayoutManager extends LinearLayoutManager {
private static final String TAG = FullLinearLayoutManager.class.getSimpleName();
public FullLinearLayoutManager(Context context) {
super(context);
}
public FullLinearLayoutManager(Context context, int orientation, boolean reverseLayout) {
super(context, orientation, reverseLayout);
}
private int[] mMeasuredDimension = new int[2];
@Override
public void onMeasure(RecyclerView.Recycler recycler, RecyclerView.State state,
int widthSpec, int heightSpec) {
final int widthMode = View.MeasureSpec.getMode(widthSpec);
final int heightMode = View.MeasureSpec.getMode(heightSpec);
final int widthSize = View.MeasureSpec.getSize(widthSpec);
final int heightSize = View.MeasureSpec.getSize(heightSpec);
int width = 0;
int height = 0;
for (int i = 0; i < getItemCount(); i++) {
measureScrapChild(recycler, i,
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
View.MeasureSpec.makeMeasureSpec(i, View.MeasureSpec.UNSPECIFIED),
mMeasuredDimension);
if (getOrientation() == HORIZONTAL) {
width = width + mMeasuredDimension[0];
if (i == 0) {
height = mMeasuredDimension[1];
}
} else {
height = height + mMeasuredDimension[1];
if (i == 0) {
width = mMeasuredDimension[0];
}
}
}
switch (widthMode) {
case View.MeasureSpec.EXACTLY:
width = widthSize;
case View.MeasureSpec.AT_MOST:
case View.MeasureSpec.UNSPECIFIED:
}
switch (heightMode) {
case View.MeasureSpec.EXACTLY:
height = heightSize;
case View.MeasureSpec.AT_MOST:
case View.MeasureSpec.UNSPECIFIED:
}
setMeasuredDimension(width, height);
}
private void measureScrapChild(RecyclerView.Recycler recycler, int position, int widthSpec,
int heightSpec, int[] measuredDimension) {
try {
View view = recycler.getViewForPosition(0);//fix 動態添加時報IndexOutOfBoundsException
if (view != null) {
RecyclerView.LayoutParams p = (RecyclerView.LayoutParams) view.getLayoutParams();
int childWidthSpec = ViewGroup.getChildMeasureSpec(widthSpec,
getPaddingLeft() + getPaddingRight(), p.width);
int childHeightSpec = ViewGroup.getChildMeasureSpec(heightSpec,
getPaddingTop() + getPaddingBottom(), p.height);
view.measure(childWidthSpec, childHeightSpec);
measuredDimension[0] = view.getMeasuredWidth() + p.leftMargin + p.rightMargin;
measuredDimension[1] = view.getMeasuredHeight() + p.bottomMargin + p.topMargin;
recycler.recycleView(view);
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
4.Adapter
import android.content.Context;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
import java.util.List;
/**
* Created by y.vn on 2016/12/21.
*/
public class RecycleViewAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private Context context;
private List<String> firstList;
private List<String> secondList;
private List<String> thirdList;
private OnItemListener listener;
public RecycleViewAdapter(Context context, List<String> firstList, List<String> secondList, List<String> thirdList) {
this.context = context;
this.firstList = firstList;
this.secondList = secondList;
this.thirdList = thirdList;
}
public void setOnItemListener(OnItemListener onItemListener) {
this.listener = onItemListener;
}
public interface OnItemListener {
//此處可以選擇我們需要的參數例如position.
void onClick(View v, int position);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
RecyclerView.ViewHolder holder = null;
switch (viewType) {
case 0:
holder = new MySignHolder1(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false));
break;
case 1:
holder = new MySignHolder2(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false));
break;
case 2:
holder = new MySignHolder3(LayoutInflater.from(context).inflate(R.layout.item_list, parent, false));
break;
}
return holder;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
if (holder instanceof MySignHolder1 && firstList.size() != 0) {
MySignHolder1 md1 = (MySignHolder1) holder;
if (position == 0) {
md1.list_title.setVisibility(View.VISIBLE);
md1.list_title.setText("第一種佈局");
}
if (position == firstList.size() - 1) {
md1.list_line.setVisibility(View.GONE);
}
md1.list_text.setText(firstList.get(position));
} else if (holder instanceof MySignHolder2 && secondList.size() != 0) {
MySignHolder2 md2 = (MySignHolder2) holder;
int position2 = position - firstList.size();
if (position2 == 0) {
md2.list_title.setVisibility(View.VISIBLE);
md2.list_title.setText("第二種佈局");
}
if (position2 == secondList.size() - 1) {
md2.list_line.setVisibility(View.GONE);
}
md2.list_text.setText(secondList.get(position2));
} else if (holder instanceof MySignHolder3 && thirdList.size() != 0) {
MySignHolder3 md3 = (MySignHolder3) holder;
int position3 = position - (firstList.size() + secondList.size());
if (position3 == 0) {
md3.list_title.setVisibility(View.VISIBLE);
md3.list_title.setText("第三種佈局");
}
if (position3 == thirdList.size() - 1) {
md3.list_line.setVisibility(View.GONE);
}
md3.list_text.setText(thirdList.get(position3));
}
}
@Override
public int getItemCount() {
return firstList.size() + secondList.size() + thirdList.size();
}
//當前的列表佈局中有幾種不同的分類,那麼就在數組中定義n個不重複的數字
int[] type = {0, 1, 2};
@Override
public int getItemViewType(int position) {
if (position >= 0 && position < firstList.size()) {
return type[0];
} else if (position >= firstList.size() && position < firstList.size() + secondList.size()) {
return type[1];
} else {
return type[2];
}
}
private class MySignHolder1 extends RecyclerView.ViewHolder {
TextView list_title, list_text, list_line;
public MySignHolder1(View itemView) {
super(itemView);
list_title = (TextView) itemView.findViewById(R.id.list_title);
list_text = (TextView) itemView.findViewById(R.id.list_text);
list_line = (TextView) itemView.findViewById(R.id.list_line);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onClick(v, getLayoutPosition());
}
}
});
}
}
private class MySignHolder2 extends RecyclerView.ViewHolder {
TextView list_title, list_text, list_line;
public MySignHolder2(View itemView) {
super(itemView);
list_title = (TextView) itemView.findViewById(R.id.list_title);
list_text = (TextView) itemView.findViewById(R.id.list_text);
list_line = (TextView) itemView.findViewById(R.id.list_line);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onClick(v, getLayoutPosition());
}
}
});
}
}
private class MySignHolder3 extends RecyclerView.ViewHolder {
TextView list_title, list_text, list_line;
public MySignHolder3(View itemView) {
super(itemView);
list_title = (TextView) itemView.findViewById(R.id.list_title);
list_text = (TextView) itemView.findViewById(R.id.list_text);
list_line = (TextView) itemView.findViewById(R.id.list_line);
itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (listener != null) {
listener.onClick(v, getLayoutPosition());
}
}
});
}
}
}
5.layout裏面的佈局
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context="com.example.recycleview.MainActivity">
<android.support.v7.widget.RecyclerView
android:id="@+id/recycleview"
android:layout_width="match_parent"
android:layout_height="match_parent" />
</RelativeLayout>
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:orientation="vertical">
<TextView
android:id="@+id/list_title"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center_horizontal"
android:padding="@dimen/text_10dp"
android:text="第一種佈局"
android:textColor="@color/colorPrimaryDark"
android:textSize="@dimen/text_20dp"
android:visibility="gone"/>
<TextView
android:id="@+id/list_text"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="@dimen/text_10dp"
android:textSize="@dimen/text_10dp" />
<TextView
android:id="@+id/list_line"
android:layout_width="match_parent"
android:layout_height="1dp"
android:background="@color/gray" />
</LinearLayout>
最後附上鍊接點擊打開鏈接