开发中如果遇到界面比较复杂的情况,可以考虑封装成一个个单独的View, 把逻辑封装到每个单独的View中,减少activity或fragment里的代码,便于管理代码。
一般这种自定义View继承自FrameLayout就好。
实现效果如下图,是一个横向滑动的recyclerview( 并把recyclerview的item的点击事件暴露出来了),结果是activity 中关于recyclerview的逻辑代码毛都没有,把activity脱光光;
下面直接上代码
MainActivity里的代码(毛都没有,就是这么光溜溜)
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
}
activity_main布局文件(只包含一个封装的view的布局)
<?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"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.febmaple.customviewtest.MainActivity">
<com.febmaple.customviewtest.MyCustomView
android:layout_width="match_parent"
android:layout_height="100dp"
android:padding="10dp">
</com.febmaple.customviewtest.MyCustomView>
</RelativeLayout>
开始我们封装的View
public class MyCustomView extends FrameLayout implements MyCustomViewAdapter.onItemClickListener {
private View viewChild;
private Context mContext;
private LayoutInflater layoutInflater;
private MyCustomViewAdapter adapter;
private List<String> mList = new ArrayList<>();
public MyCustomView(Context context) {
this(context, null);
}
public MyCustomView(Context context, AttributeSet attrs) {
this(context, attrs, 0);
}
public MyCustomView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
mContext = context;
layoutInflater = LayoutInflater.from(context);
initViews();
initData();
addView(viewChild);//给自定义view添加内容view
}
//以上三个构造方法是关键
private RecyclerView rvTest;
private void initViews() {
viewChild = layoutInflater.inflate(R.layout.customview_item, null);
rvTest = (RecyclerView) viewChild.findViewById(R.id.rv_test);
rvTest.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.HORIZONTAL, false));
}
private void initData() {
for (int i = 0; i < 10; i++) {
mList.add("nimadan" + i);
}
adapter = new MyCustomViewAdapter(mContext, mList);
adapter.setOnItemClickListener(this);//利用监听器模式把recyclerview的点击事件暴露出来。
rvTest.setAdapter(adapter);
adapter.notifyDataSetChanged();
}
@Override
public void onItemClick(int position) {
Toast.makeText(mContext, "nima" + position, Toast.LENGTH_SHORT).show();
}
}
MyCustomView的布局
<?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="100dp"
android:orientation="vertical">
<android.support.v7.widget.RecyclerView
android:id="@+id/rv_test"
android:layout_width="match_parent"
android:layout_height="100dp">
</android.support.v7.widget.RecyclerView>
</LinearLayout>
MyCustomView中recyclerview的adapter
public class MyCustomViewAdapter extends RecyclerView.Adapter<MyCustomViewAdapter.MyViewHolder> {
private static Context mContext;
private LayoutInflater mLayoutInflater;
private List<String> mRankList;
public MyCustomViewAdapter(Context context, List<String> ranklist) {
mContext = context;
mRankList = ranklist;
mLayoutInflater = LayoutInflater.from(context);
}
// public void updataAdapter(ArrayList<String> newList) {
// mRankList = newList;
// notifyDataSetChanged();
// }
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
return new MyViewHolder(mLayoutInflater.inflate(R.layout.rv_item, parent, false));
}
@Override
public void onBindViewHolder(MyViewHolder holder, int position) {
holder.bindData(mRankList, position);
}
@Override
public int getItemCount() {
return mRankList == null ? 0 : mRankList.size();
}
private static onItemClickListener itemClickListener;
public static class MyViewHolder extends RecyclerView.ViewHolder {
private TextView tv_rv_item;
public MyViewHolder(View itemView) {
super(itemView);
initView(itemView);
}
private void initView(View itemView) {
tv_rv_item = (TextView) itemView.findViewById(R.id.tv_rv_item);
}
public void bindData(List<String> aRankList, final int position) {
tv_rv_item.setText(aRankList.get(position));
tv_rv_item.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (itemClickListener != null) {
itemClickListener.onItemClick(position);
}
}
});
}
}
public interface onItemClickListener {
public void onItemClick(int position);
}
public void setOnItemClickListener(onItemClickListener listener) {
itemClickListener = listener;
}
}