Android直播APP源码中排行榜功能如何实现
刚进公司的时候,听技术人员说起直播APP源码中的“排行榜”功能,小编最先想到的是学生时期的成绩排行,上榜的沾沾自喜到下次考试,下榜的哭哭啼啼,其实就算上榜也并没有什么实质性的奖励,且上榜的第十名和下榜的第十一名,区别也不大,但大家还是尽量争夺使自己“榜上有名”,以满足心理需求。
在直播APP中,排行榜对于“土豪”的作用同样是满足其心理需求,刺激用户打赏上榜而设置的,对于主播而言,则有增加知名度的用处,为主播接广告等流量变现活动做参考。
本文主要讲述,如何在Android端直播APP源码中实现排行榜功能,如下图所示,在云豹直播app首页上有收益榜和贡献榜两个按钮,点击即可分别进入对应的排行榜列表页面。


无论是进入收益榜还是贡献榜,均可以再次(双向)切换到另一列表。收益榜列表顶部显示前三名收益最高的主播,贡献榜顶部显示了消费最多的三个用户。下面的用户按收益和消费倒序排列。点击头像可进入个人主页,点击关注可以关注对应的用户。
部分直播app源码如下:
public class RankActivity extends AbsActivity {
public static void forward(Context context, int position) {
Intent intent = new Intent(context, RankActivity.class);
intent.putExtra(Constants.LIVE_POSITION, position);
context.startActivity(intent);
}
@Override
protected boolean isStatusBarWhite() {
return true;
}
@Override
protected int getLayoutId() {
return R.layout.activity_rank;
}
@Override
protected void main() {
int position = getIntent().getIntExtra(Constants.LIVE_POSITION, 0);
MainListViewHolder viewHolder = new MainListViewHolder(mContext, (ViewGroup) findViewById(R.id.container));
viewHolder.addToParent();
viewHolder.subscribeActivityLifeCycle();
viewHolder.loadData(position);
}
}
public class MainListViewHolder extends AbsMainViewHolder {
private static final int PAGE_COUNT = 2;
private List<FrameLayout> mViewList;
private AbsMainListChildViewHolder[] mViewHolders;
private MainListProfitViewHolder mProfitViewHolder;//收益榜
private MainListContributeViewHolder mContributeViewHolder;//贡献榜
private MagicIndicator mIndicator;
private ViewPager mViewPager;
public MainListViewHolder(Context context, ViewGroup parentView) {
super(context, parentView);
}
@Override
protected int getLayoutId() {
return R.layout.view_main_list;
}
@Override
public void init() {
mViewList = new ArrayList<>();
for (int i = 0; i < PAGE_COUNT; i++) {
FrameLayout frameLayout = new FrameLayout(mContext);
frameLayout.setLayoutParams(new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));
mViewList.add(frameLayout);
}
mViewHolders = new AbsMainListChildViewHolder[PAGE_COUNT];
mViewPager = (ViewPager) findViewById(R.id.viewPager);
mViewPager.setOffscreenPageLimit(PAGE_COUNT - 1);
mViewPager.setAdapter(new ViewPagerAdapter(mViewList));
mViewPager.addOnPageChangeListener(new ViewPager.OnPageChangeListener() {
@Override
public void onPageScrolled(int position, float positionOffset, int positionOffsetPixels) {
}
@Override
public void onPageSelected(int position) {
loadPageData(position);
}
@Override
public void onPageScrollStateChanged(int state) {
}
});
mIndicator = (MagicIndicator) findViewById(R.id.indicator);
final String[] titles = new String[]{
WordUtil.getString(R.string.main_list_profit),
WordUtil.getString(R.string.main_list_contribute)
};
CommonNavigator commonNavigator = new CommonNavigator(mContext);
commonNavigator.setAdapter(new CommonNavigatorAdapter() {
@Override
public int getCount() {
return titles.length;
}
@Override
public IPagerTitleView getTitleView(Context context, final int index) {
SimplePagerTitleView simplePagerTitleView = new ColorTransitionPagerTitleView(context);
simplePagerTitleView.setNormalColor(0xccffffff);
simplePagerTitleView.setSelectedColor(ContextCompat.getColor(mContext, R.color.white));
simplePagerTitleView.setText(titles[index]);
simplePagerTitleView.setTextSize(18);
simplePagerTitleView.getPaint().setFakeBoldText(true);
simplePagerTitleView.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
if (mViewPager != null) {
mViewPager.setCurrentItem(index);
}
}
});
return simplePagerTitleView;
}
@Override
public IPagerIndicator getIndicator(Context context) {
LinePagerIndicator linePagerIndicator = new LinePagerIndicator(context);
linePagerIndicator.setMode(LinePagerIndicator.MODE_WRAP_CONTENT);
linePagerIndicator.setXOffset(DpUtil.dp2px(13));
linePagerIndicator.setRoundRadius(DpUtil.dp2px(2));
linePagerIndicator.setColors(ContextCompat.getColor(mContext, R.color.white));
return linePagerIndicator;
}
});
mIndicator.setNavigator(commonNavigator);
ViewPagerHelper.bind(mIndicator, mViewPager);
EventBus.getDefault().register(MainListViewHolder.this);
}
private void loadPageData(int position) {
if (mViewHolders == null) {
return;
}
AbsMainListChildViewHolder vh = mViewHolders[position];
if (vh == null) {
if (mViewList != null && position < mViewList.size()) {
FrameLayout parent = mViewList.get(position);
if (parent == null) {
return;
}
if (position == 0) {
mProfitViewHolder = new MainListProfitViewHolder(mContext, parent);
vh = mProfitViewHolder;
} else if (position == 1) {
mContributeViewHolder = new MainListContributeViewHolder(mContext, parent);
vh = mContributeViewHolder;
}
if (vh == null) {
return;
}
mViewHolders[position] = vh;
vh.addToParent();
vh.subscribeActivityLifeCycle();
}
}
if (vh != null) {
vh.loadData();
}
}
public void loadData(int position) {
if (mViewPager != null) {
int curPosition = mViewPager.getCurrentItem();
if (curPosition == position) {
loadPageData(curPosition);
} else {
mViewPager.setCurrentItem(position);
}
}
}
@Override
public void loadData() {
if (mViewPager != null) {
loadPageData(mViewPager.getCurrentItem());
}
}
@Override
public void onDestroy() {
super.onDestroy();
EventBus.getDefault().unregister(MainListViewHolder.this);
}
@Subscribe(threadMode = ThreadMode.MAIN)
public void onFollowEvent(FollowEvent e) {
if (mViewHolders != null) {
for (AbsMainListChildViewHolder vh : mViewHolders) {
if (vh != null) {
vh.onFollowEvent(e.getToUid(), e.getIsAttention());
}
}
}
}
}
public abstract class AbsMainListChildViewHolder extends AbsMainViewHolder implements OnItemClickListener<ListBean>, View.OnClickListener {
public static final String DAY = "day";
public static final String WEEK = "week";
public static final String MONTH = "month";
public static final String TOTAL = "total";
protected String mType;
protected CommonRefreshView mRefreshView;
protected MainListAdapter mAdapter;
public AbsMainListChildViewHolder(Context context, ViewGroup parentView) {
super(context, parentView);
mType = DAY;
}
@Override
protected int getLayoutId() {
return R.layout.view_main_list_page;
}
@Override
public void init() {
mRefreshView = (CommonRefreshView) findViewById(R.id.refreshView);
mRefreshView.setEmptyLayoutId(R.layout.view_no_data_list);
mRefreshView.setLayoutManager(new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false));
findViewById(R.id.btn_day).setOnClickListener(this);
findViewById(R.id.btn_week).setOnClickListener(this);
findViewById(R.id.btn_month).setOnClickListener(this);
findViewById(R.id.btn_total).setOnClickListener(this);
}
@Override
public void loadData() {
if (!isFirstLoadData()) {
return;
}
if (mRefreshView != null) {
mRefreshView.initData();
}
}
@Override
public void onDestroy() {
super.onDestroy();
CommonHttpUtil.cancel(CommonHttpConsts.SET_ATTENTION);
}
public void onFollowEvent(String touid, int isAttention) {
if (mAdapter != null) {
mAdapter.updateItem(touid, isAttention);
}
}
@Override
public void onItemClick(ListBean bean, int position) {
RouteUtil.forwardUserHome(mContext, bean.getUid());
}
@Override
public void onClick(View v) {
int i = v.getId();
String type = null;
if (i == R.id.btn_day) {
type = DAY;
} else if (i == R.id.btn_week) {
type = WEEK;
} else if (i == R.id.btn_month) {
type = MONTH;
} else if (i == R.id.btn_total) {
type = TOTAL;
}
if (!TextUtils.isEmpty(type) && !type.equals(mType)) {
mType = type;
if (mRefreshView != null) {
mRefreshView.initData();
}
}
}
}
/**
* 首页 排行 收益榜
*/
public class MainListProfitViewHolder extends AbsMainListChildViewHolder {
public MainListProfitViewHolder(Context context, ViewGroup parentView) {
super(context, parentView);
}
@Override
public void init() {
super.init();
mRefreshView.setDataHelper(new CommonRefreshView.DataHelper<ListBean>() {
@Override
public RefreshAdapter<ListBean> getAdapter() {
if (mAdapter == null) {
mAdapter = new MainListAdapter(mContext, MainListAdapter.TYPE_PROFIT);
mAdapter.setOnItemClickListener(MainListProfitViewHolder.this);
}
return mAdapter;
}
@Override
public void loadData(int p, HttpCallback callback) {
if(!mType.isEmpty()){
MainHttpUtil.profitList(mType, p, callback);
}
}
@Override
public List<ListBean> processData(String[] info) {
return JSON.parseArray(Arrays.toString(info), ListBean.class);
}
@Override
public void onRefreshSuccess(List<ListBean> list, int listCount) {
}
@Override
public void onRefreshFailure() {
}
@Override
public void onLoadMoreSuccess(List<ListBean> loadItemList, int loadItemCount) {
}
@Override
public void onLoadMoreFailure() {
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
MainHttpUtil.cancel(MainHttpConsts.PROFIT_LIST);
}
}
/**
* 首页 排行 贡献榜
*/
public class MainListContributeViewHolder extends AbsMainListChildViewHolder {
public MainListContributeViewHolder(Context context, ViewGroup parentView) {
super(context, parentView);
}
@Override
public void init() {
super.init();
mRefreshView.setDataHelper(new CommonRefreshView.DataHelper<ListBean>() {
@Override
public RefreshAdapter<ListBean> getAdapter() {
if (mAdapter == null) {
mAdapter = new MainListAdapter(mContext, MainListAdapter.TYPE_CONTRIBUTE);
mAdapter.setOnItemClickListener(MainListContributeViewHolder.this);
}
return mAdapter;
}
@Override
public void loadData(int p, HttpCallback callback) {
if (!mType.isEmpty()) {
MainHttpUtil.consumeList(mType, p, callback);
}
}
@Override
public List<ListBean> processData(String[] info) {
return JSON.parseArray(Arrays.toString(info), ListBean.class);
}
@Override
public void onRefreshSuccess(List<ListBean> list, int listCount) {
}
@Override
public void onRefreshFailure() {
}
@Override
public void onLoadMoreSuccess(List<ListBean> loadItemList, int loadItemCount) {
}
@Override
public void onLoadMoreFailure() {
}
});
}
@Override
public void onDestroy() {
super.onDestroy();
MainHttpUtil.cancel(MainHttpConsts.CONSUME_LIST);
}
}以上便是本文《Android直播APP源码中排行榜功能如何实现》的全部内容,除排行榜功能外,还有云豹直播app源码中还有很多功能用于促进用户打赏,推进平台盈利,具体内容会在以后逐步放出,敬请期待。
声明:以上内容由云豹科技原创,未经公司同意,禁止转载,否则将追究相关法律责任www.yunbaokj.com






鲁公网安备 37090202000844号

