我正在使用异构Recyclerview
,我也在使用dataBinding
。它有一个标题和另外两个项目。现在,从API中,我获取标题的数据,但作为对象,而不是列表。目前,API并未提供列表,因此它只是虚拟数据。当我从fragment
中的API获取该对象时,我的计划是填充对象的标题。但是notifyDatasetChanged
没有做任何事情,并且Recyclerview
没有填充。每次要填充Recyclerview
时,是否需要使用列表?
Recyclerview
public class ProfileAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> {
private final int HEADER_TYPE = 0;
private final int IMAGE_GRID_TYPE = 1;
private final int IMAGE_LIST_TYPE = 2;
private final int cellSize;
private final int cellSizeH;
private Context mContext;
private boolean onBind;
private OnHeaderItemClickedListener mListener;
private List<Home> mHomeList;
private int mInstance;
private UserProfileResult.UserProfile mProfileResult;
public ProfileAdapter(Context context, List<Home> homeList, UserProfileResult.UserProfile profileResult, int instance) {
this.mContext = context;
this.mHomeList = homeList;
this.mProfileResult = profileResult;
this.cellSize = Utils.getScreenWidth(context) / 3;
this.cellSizeH = Utils.getScreenWidth(context) / 2;
this.mInstance = instance;
}
@Override
public void onDetachedFromRecyclerView(RecyclerView recyclerView) {
super.onDetachedFromRecyclerView(recyclerView);
}
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
LayoutInflater inflater = LayoutInflater.from(mContext);
switch (viewType) {
case HEADER_TYPE:
View viewHeader = inflater.inflate(R.layout.item_profile_header, parent, false);
StaggeredGridLayoutManager.LayoutParams lp1 = (StaggeredGridLayoutManager.LayoutParams) viewHeader.getLayoutParams();
lp1.setFullSpan(true);
viewHeader.setLayoutParams(lp1);
return new ProfileAdapter.HeaderHolder(viewHeader);
case IMAGE_GRID_TYPE:
View viewGridImage = inflater.inflate(R.layout.item_profile_grid_image, parent, false);
StaggeredGridLayoutManager.LayoutParams layoutParams = (StaggeredGridLayoutManager.LayoutParams) viewGridImage.getLayoutParams();
layoutParams.height = cellSizeH;
layoutParams.width = cellSize;
layoutParams.setFullSpan(false);
viewGridImage.setLayoutParams(layoutParams);
return new ProfileAdapter.ImageGridHolder(viewGridImage);
case IMAGE_LIST_TYPE:
View viewListImage = inflater.inflate(R.layout.item_double_image, parent, false);
StaggeredGridLayoutManager.LayoutParams lp3 = (StaggeredGridLayoutManager.LayoutParams) viewListImage.getLayoutParams();
lp3.setFullSpan(true);
viewListImage.setLayoutParams(lp3);
return new ProfileAdapter.ImageListHolder(viewListImage);
}
return null;
}
@Override
public void onBindViewHolder(RecyclerView.ViewHolder holder, int position) {
switch (holder.getItemViewType()) {
case HEADER_TYPE:
onBind = true;
bindHeader((ProfileAdapter.HeaderHolder) holder, mProfileResult);
onBind = false;
break;
case IMAGE_GRID_TYPE:
onBind = true;
bindGridImage((ProfileAdapter.ImageGridHolder) holder, getHomeItem(position));
onBind = false;
break;
case IMAGE_LIST_TYPE:
onBind = true;
bindListImage((ProfileAdapter.ImageListHolder) holder, getHomeItem(position));
onBind = false;
break;
}
}
private void bindHeader(final ProfileAdapter.HeaderHolder holder, UserProfileResult.UserProfile profile) {
holder.mItemProfileHeaderBinding.setProfile(profile);
private void bindGridImage(ProfileAdapter.ImageGridHolder holder, final Home home) {
holder.getItemProfileGridImageBinding().setHome(home);
private void bindListImage(ProfileAdapter.ImageListHolder holder, Home home) {
holder.getItemProfileListImageBinding().setHome(home);
@Override
public int getItemViewType(int position) {
if (isPositionHeader(position)) {
return HEADER_TYPE;
}
if (getHomeItem(position).getListType() == 2) {
return IMAGE_LIST_TYPE;
} else {
return IMAGE_GRID_TYPE;
}
}
private boolean isPositionHeader(int position) {
return position == 0;
}
@Override
public int getItemCount() {
return mHomeList.size() + 1;
}
private Home getHomeItem(int position) {
return mHomeList.get(position - 1);
}
private static class HeaderHolder extends RecyclerView.ViewHolder {
ItemProfileHeaderBinding mItemProfileHeaderBinding;
HeaderHolder(View itemView) {
super(itemView);
mItemProfileHeaderBinding = DataBindingUtil.bind(itemView);
}
ItemProfileHeaderBinding getItemProfileHeaderBinding() {
return mItemProfileHeaderBinding;
}
}
private static class ImageGridHolder extends RecyclerView.ViewHolder {
ItemProfileGridImageBinding mItemProfileGridImageBinding;
ImageGridHolder(View itemView) {
super(itemView);
mItemProfileGridImageBinding = DataBindingUtil.bind(itemView);
}
ItemProfileGridImageBinding getItemProfileGridImageBinding() {
return mItemProfileGridImageBinding;
}
}
private static class ImageListHolder extends RecyclerView.ViewHolder {
ItemDoubleImageBinding mItemProfileListImageBinding;
ImageListHolder(View itemView) {
super(itemView);
mItemProfileListImageBinding = DataBindingUtil.bind(itemView);
}
ItemDoubleImageBinding getItemProfileListImageBinding() {
return mItemProfileListImageBinding;
}
}
}
Fragment
public class ProfileFragment extends BaseChildFragment implements ProfileAdapter.OnHeaderItemClickedListener,
SwipeRefreshLayout.OnRefreshListener,
GetProfileView<UserProfileResult> {
private static final String ARG_PARAM1 = "param1";
FragmentProfileBinding mBinder;
FragmentManager mFragmentManager;
GetProfilePresenter mPresenter;
Home mHome;
Home tHome;
User mUser;
Parcelable mParcelable;
List<Home> mHomeList;
UserProfileResult.UserProfile mProfileResult;
ProfileAdapter mAdapter;
StaggeredGridLayoutManager mManager;
EndlessRecyclerViewScrollListener mEndlessScrollListener;
PreferenceAdapter mPreferenceAdapter;
int mInstance;
Bundle savedState = null;
public ProfileFragment() {
}
public static ProfileFragment newInstance(User user, int instance) {
ProfileFragment fragment = new ProfileFragment();
Bundle args = new Bundle();
args.putInt(ARGS_INSTANCE, instance);
args.putParcelable(ARG_PARAM1, Parcels.wrap(user));
fragment.setArguments(args);
return fragment;
}
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments() != null) {
mInstance = getArguments().getInt(ARGS_INSTANCE);
mParcelable = getArguments().getParcelable(ARG_PARAM1);
mUser = Parcels.unwrap(mParcelable);
}
mHomeList = new ArrayList<>();
mProfileResult = new UserProfileResult.UserProfile();
}
@Nullable
@Override
public View onCreateView(LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
mBinder = DataBindingUtil.inflate(inflater, R.layout.fragment_profile, container, false);
mFragmentManager = getChildFragmentManager();
mHome = new Home();
tHome = new Home();
mPresenter = new GetProfilePresenterImpl(this);
mPreferenceAdapter = new PreferenceAdapter(getContext());
mManager = new StaggeredGridLayoutManager(3, StaggeredGridLayoutManager.VERTICAL);
mAdapter = new ProfileAdapter(getContext(), mHomeList, mProfileResult, mInstance);
mBinder.rvGrid.setLayoutManager(mManager);
mBinder.rvGrid.setAdapter(mAdapter);
mBinder.srLayout.setOnRefreshListener(this);
mEndlessScrollListener = new EndlessRecyclerViewScrollListener(mManager) {
@Override
public void onLoadMore(int page, int totalItemsCount, RecyclerView view) {
}
};
mBinder.rvGrid.addOnScrollListener(mEndlessScrollListener);
EventBus.getDefault().register(this);
setUIListeners();
return mBinder.getRoot();
}
@Override
public void onViewCreated(View view, @Nullable Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
mPresenter.getProfile(mUser);
}
@Override
public void onDestroyView() {
super.onDestroyView();
mBinder.rvGrid.removeOnScrollListener(mEndlessScrollListener);
mPresenter.cleanup();
EventBus.getDefault().unregister(this);
}
@Override
public void getProfileResult(Result<UserProfileResult> result) {
if (result.getData().isSuccess()) {
mBinder.setProfile(result.getData().getUserProfile());
mProfileResult = result.getData().getUserProfile();
mHomeList.clear();
populateList();
populateSecondList();
mAdapter.notifyDataSetChanged();
}
}
@Override
public void onRefresh() {
mHomeList.clear();
populateList();
populateSecondList();
mAdapter.notifyDataSetChanged();
mEndlessScrollListener.resetState();
mBinder.srLayout.setRefreshing(false);
}
private void populateList() {
for (int i = 0; i < 5; i++) {
mHome.setType(0);
mHomeList.add(i, mHome);
}
}
private void populateSecondList() {
for (int i = 0; i < 5; i++) {
tHome.setType(1);
mHomeList.add(i, tHome);
}
}
}
}