推荐:
- 普通的 Fragment 的简单使用
- 侧面点击的 Fragment (类似于电商类)
今日写了一个侧面点击的 Fragment (类似于电商类),做一下记录,下面是效果图:
下面是主要内容:
- MainActivity 代码和 activity_main 布局文件
- Adapter 代码和 adapter 布局文件
- MainFragment 代码 和 fragment_main 布局文件
这是上面效果图的源码&&&
github 下载地址:https://github.com/wuqingsen/Fragment
1. MainActivity 代码和 activity_main 布局文件
下面是 MainAcitvity 中的代码:
import android.app.Activity;
import android.app.Fragment;
import android.os.Bundle;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import java.util.ArrayList;
import java.util.List;
public class MainActivity extends Activity {
private RecyclerView recyclerView;
private List<String> titleList;//标题列表
private List<Fragment> fragmentList;//fragment列表
private Adapter adapter;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
recyclerView = findViewById(R.id.recyclerView);
//设置侧面标题以及适配器
setTitleList();
//添加fragment并设置显示位置为第一个
setFragment();
}
//设置侧面标题以及适配器
private void setTitleList() {
//模拟,为标题添加数据
titleList = new ArrayList<>();
titleList.add("男装");
titleList.add("女装");
titleList.add("童装");
titleList.add("男鞋");
titleList.add("女鞋");
//设置侧面标题适配器
adapter = new Adapter(this, titleList);
recyclerView.setAdapter(adapter);
recyclerView.setLayoutManager(new LinearLayoutManager(this));
adapter.setmOnItemClickListerer(new Adapter.OnItemClickListener() {
@Override
public void onItemClick(int position, String type) {
setFragmentSite(position);
}
});
}
//添加fragment并设置显示位置为第一个
private void setFragment() {
fragmentList = new ArrayList<>();
android.app.FragmentTransaction fTransaction = getFragmentManager().beginTransaction();
//将 MainFragment 添加到列表中,以供显示
for (int i = 0; i < titleList.size(); i++) {
fragmentList.add(new MainFragment(titleList.get(i)));
fTransaction.add(R.id.fl_content, fragmentList.get(i));
}
fTransaction.commitAllowingStateLoss();
//设置fragment位置;默认第一个,即传0;
setFragmentSite(0);
}
//设置fragment位置
private void setFragmentSite(int position) {
//防止为空
if (fragmentList == null || fragmentList.size() == 0) {
setFragment();
return;
}
android.app.FragmentTransaction fTransaction = getFragmentManager().beginTransaction();
//隐藏所有的Fragment
for (int i = 0; i < fragmentList.size(); i++) {
fTransaction.hide(fragmentList.get(i));
}
//显示特定的Fragment
fTransaction.show(fragmentList.get(position)).commitAllowingStateLoss();
}
}
注意:
- 我在上面导入的是 android.app.Fragment; 不要与 import android.support.v4.app.Fragment; 搞混了。
- 不要忘记在 build.gradle 文件中添加:implementation 'com.android.support:recyclerview-v7:26.1.0'
下面是 activity_main 的布局文件:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<!--标题-->
<TextView
android:id="@+id/tv_title"
android:layout_width="match_parent"
android:layout_height="50dp"
android:text="标题"
android:textSize="18dp"
android:textColor="#000000"
android:gravity="center"/>
<android.support.v7.widget.RecyclerView
android:id="@+id/recyclerView"
android:layout_width="90dp"
android:layout_height="match_parent"
android:scrollbars="none"
android:background="#FFF3F4F6"
android:layout_below="@+id/tv_title"/>
<FrameLayout
android:id="@+id/fl_content"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_toRightOf="@+id/recyclerView"
android:layout_below="@+id/tv_title"/>
</RelativeLayout>
2. Adapter 代码和 adapter 布局文件
下面是侧面标题栏的列表适配器 Adapter 中代码:
public class Adapter extends RecyclerView.Adapter<Adapter.MyViewHolder> {
private LayoutInflater inflater;
private Context context;
private List<String> list = new ArrayList<>();
private HashMap<Integer, RelativeLayout> mapRl = new HashMap<>();//存储背景
private HashMap<Integer, ImageView> mapIv = new HashMap<>();//存储图标
private HashMap<Integer, TextView> mapTv = new HashMap<>();//存储标题
//接口回调
public interface OnItemClickListener {
void onItemClick(int position, String type);
}
public Adapter.OnItemClickListener mOnItemClickListerer;
public void setmOnItemClickListerer(Adapter.OnItemClickListener listerer) {
this.mOnItemClickListerer = listerer;
}
public Adapter(Context context, List<String> list) {
this.context = context;
this.list = list;
inflater = LayoutInflater.from(context);
}
@Override
public MyViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
View view = inflater.inflate(R.layout.adapter, parent, false);
MyViewHolder viewHolder = new MyViewHolder(view);
return viewHolder;
}
@Override
public void onBindViewHolder(final MyViewHolder holder, final int position) {
holder.tv_name.setText(list.get(position));
mapRl.put(position, holder.rl_all);//储存背景
mapIv.put(position, holder.iv_icon);//储存图片
mapTv.put(position, holder.tv_name);//储存名称
holder.itemView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
//将所有字体颜色,图片背景,遍历设置颜色
for (HashMap.Entry<Integer, RelativeLayout> entry : mapRl.entrySet()) {
entry.getValue().setBackgroundColor(Color.parseColor("#FFF3F4F6"));
}
for (HashMap.Entry<Integer, ImageView> entry : mapIv.entrySet()) {
entry.getValue().setVisibility(View.GONE);
}
for (HashMap.Entry<Integer, TextView> entry : mapTv.entrySet()) {
entry.getValue().setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
entry.getValue().setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
}
holder.rl_all.setBackgroundColor(Color.parseColor("#FFFFFFFF"));//设置背景
holder.iv_icon.setVisibility(View.VISIBLE);
holder.tv_name.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);//设置字体大小
holder.tv_name.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));//设置高亮
mOnItemClickListerer.onItemClick(position, "");
}
});
//默认选中第一项
if (position == 0) {
holder.rl_all.setBackgroundColor(Color.parseColor("#FFFFFFFF"));
holder.iv_icon.setVisibility(View.VISIBLE);
holder.tv_name.setTextSize(TypedValue.COMPLEX_UNIT_SP, 16);
holder.tv_name.setTypeface(Typeface.defaultFromStyle(Typeface.BOLD));
} else {
holder.rl_all.setBackgroundColor(Color.parseColor("#FFF3F4F6"));
holder.iv_icon.setVisibility(View.GONE);
holder.tv_name.setTextSize(TypedValue.COMPLEX_UNIT_SP, 12);
holder.tv_name.setTypeface(Typeface.defaultFromStyle(Typeface.NORMAL));
}
}
@Override
public int getItemCount() {
return list.size();
}
class MyViewHolder extends RecyclerView.ViewHolder {
ImageView iv_icon;
TextView tv_name;
RelativeLayout rl_all;
public MyViewHolder(View itemView) {
super(itemView);
iv_icon = itemView.findViewById(R.id.iv_icon);
tv_name = itemView.findViewById(R.id.tv_name);
rl_all = itemView.findViewById(R.id.rl_all);
}
}
}
下面是布局文件 adapter 的代码:
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="90dp"
android:layout_height="50dp"
android:orientation="horizontal"
android:background="#FFFFFF"
android:id="@+id/rl_all">
<ImageView
android:id="@+id/iv_icon"
android:layout_width="4dp"
android:layout_height="20dp"
android:background="#FFF24C7C"
android:layout_centerVertical="true"/>
<TextView
android:id="@+id/tv_name"
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:text="女装"
android:textSize="15dp"
android:textColor="#FF333333"
android:gravity="center"
android:layout_centerInParent="true"/>
</RelativeLayout>
3. MainFragment 代码 和 fragment_main 布局文件
最后看一下 MainFragment 中的代码:
import android.annotation.SuppressLint;
import android.app.Fragment;
import android.os.Bundle;
import android.support.annotation.Nullable;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.TextView;
@SuppressLint("ValidFragment")
public class MainFragment extends Fragment {
private View view;
private String title;
private TextView tv_text;
public MainFragment(String title) {
this.title = title;
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
view = View.inflate(getActivity(),R.layout.fragment_main,null);
tv_text = view.findViewById(R.id.tv_text);
tv_text.setText(title);
return view;
}
}
要注意的也是要导入的 Fragment 包不要错了
下面是 fragment_main 文件中的代码:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextView
android:id="@+id/tv_text"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:textColor="#000000"
android:textSize="20dp"
android:gravity="center"/>
</LinearLayout>
当写到这个地方,以上效果图的效果便实现了。
这是上面效果图的源码&&&