使用数据

时间:2017-06-07 09:31:38

标签: android android-fragments android-recyclerview recyclerview-layout

我正在使用异构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);
        }
    }
    }
}

0 个答案:

没有答案