数据表的和老师在视频里面写的是一样的,后来又复制粘贴过来,在跑起来也是不显示标题
SubscriptionFragment的代码如下:
package com.example.himalaya.fragments;
import android.content.Intent;
import android.graphics.Rect;
import android.support.v7.widget.LinearLayoutManager;
import android.support.v7.widget.RecyclerView;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.FrameLayout;
import android.widget.TextView;
import android.widget.Toast;
import com.example.himalaya.DetailActivity;
import com.example.himalaya.R;
import com.example.himalaya.adapters.AlbumListAdapter;
import com.example.himalaya.base.BaseApplication;
import com.example.himalaya.base.BaseFragment;
import com.example.himalaya.interfaces.ISubscriptionCallback;
import com.example.himalaya.interfaces.ISubscriptionPresenter;
import com.example.himalaya.presenters.AlbumDetailPresenter;
import com.example.himalaya.presenters.SubscriptionPresenter;
import com.example.himalaya.utils.Constants;
import com.example.himalaya.views.ConfirmDialog;
import com.example.himalaya.views.UILoader;
import com.lcodecore.tkrefreshlayout.TwinklingRefreshLayout;
import com.ximalaya.ting.android.opensdk.model.album.Album;
import net.lucode.hackware.magicindicator.buildins.UIUtil;
import java.util.List;
public class SubscriptionFragment extends BaseFragment implements ISubscriptionCallback, AlbumListAdapter.OnAlbumItemClickListener, AlbumListAdapter.OnAlbumItemLongClickListener, ConfirmDialog.OnDialogActionClickListener {
private ISubscriptionPresenter mSubscriptionPresenter;
private RecyclerView mSubListView;
private AlbumListAdapter mAlbumListAdapter;
private Album mCurrentClickAlbum = null;
private UILoader mUiLoader;
@Override
protected View onSubViewLoaded(LayoutInflater layoutInflater, ViewGroup container) {
FrameLayout rootView = (FrameLayout) layoutInflater.inflate(R.layout.fragment_subscription, container, false);
if (mUiLoader == null) {
mUiLoader = new UILoader(container.getContext()) {
@Override
protected View getSuccessView(ViewGroup container) {
return createSuccessView();
}
@Override
protected View getEmptyView() {
//创建一个新的
View emptyView = LayoutInflater.from(getContext()).inflate(R.layout.fragment_empty_view, this, false);
TextView tipsView = emptyView.findViewById(R.id.empty_view_tips_tv);
tipsView.setText(R.string.no_sub_content_tips_text);
return emptyView;
}
};
if (mUiLoader.getParent() instanceof ViewGroup) {
((ViewGroup) mUiLoader.getParent()).removeView(mUiLoader);
}
rootView.addView(mUiLoader);
}
return rootView;
}
private View createSuccessView() {
View itemView = LayoutInflater.from(BaseApplication.getAppContext()).inflate(R.layout.item_subscription, null);
TwinklingRefreshLayout refreshLayout = itemView.findViewById(R.id.over_scroll_view);
refreshLayout.setEnableLoadmore(false);
refreshLayout.setEnableRefresh(false);
mSubListView = itemView.findViewById(R.id.sub_list);
mSubListView.setLayoutManager(new LinearLayoutManager(itemView.getContext()));
mSubListView.addItemDecoration(new RecyclerView.ItemDecoration() {
@Override
public void getItemOffsets(Rect outRect, View view, RecyclerView parent, RecyclerView.State state) {
outRect.top = UIUtil.dip2px(view.getContext(), 5);
outRect.bottom = UIUtil.dip2px(view.getContext(), 5);
outRect.left = UIUtil.dip2px(view.getContext(), 5);
outRect.right = UIUtil.dip2px(view.getContext(), 5);
}
});
//
mAlbumListAdapter = new AlbumListAdapter();
mAlbumListAdapter.setAlbumItemClickListener(this);
mAlbumListAdapter.setOnAlbumItemLongClickListener(this);
mSubListView.setAdapter(mAlbumListAdapter);
mSubscriptionPresenter = SubscriptionPresenter.getInstance();
mSubscriptionPresenter.registerViewCallback(this);
mSubscriptionPresenter.getSubscriptionList();
if (mUiLoader != null) {
mUiLoader.updateStatus(UILoader.UIStatus.LOADING);
}
return itemView;
}
@Override
public void onAddResult(boolean isSuccess) {
}
@Override
public void onDeleteResult(boolean isSuccess) {
//给出取消订阅的提示.
Toast.makeText(BaseApplication.getAppContext(), isSuccess ? R.string.cancel_sub_success : R.string.cancel_sub_failed, Toast.LENGTH_SHORT).show();
}
@Override
public void onSubscriptionsLoaded(List<Album> albums) {
if (albums.size() == 0) {
if (mUiLoader != null) {
mUiLoader.updateStatus(UILoader.UIStatus.EMPTY);
}
} else {
if (mUiLoader != null) {
mUiLoader.updateStatus(UILoader.UIStatus.SUCCESS);
}
}
//更新UI
if (mAlbumListAdapter != null) {
mAlbumListAdapter.setData(albums);
}
}
@Override
public void onSubFull() {
Toast.makeText(getActivity(), "订阅数量不得超过" + Constants.MAX_SUB_COUNT, Toast.LENGTH_SHORT).show();
}
@Override
public void onDestroyView() {
super.onDestroyView();
//取消接口的注册
if (mSubscriptionPresenter != null) {
mSubscriptionPresenter.unRegisterViewCallback(this);
}
mAlbumListAdapter.setAlbumItemClickListener(null);
}
@Override
public void onItemClick(int position, Album album) {
AlbumDetailPresenter.getInstance().setTargetAlbum(album);
//item被点击了,跳转到详情界面
Intent intent = new Intent(getContext(), DetailActivity.class);
startActivity(intent);
}
@Override
public void onItemLongClick(Album album) {
this.mCurrentClickAlbum = album;
//订阅的item被长按了.
// Toast.makeText(BaseApplication.getAppContext(), "订阅被长按.", Toast.LENGTH_SHORT).show();
ConfirmDialog confirmDialog = new ConfirmDialog(getActivity());
confirmDialog.setOnDialogActionClickListener(this);
confirmDialog.show();
}
@Override
public void onCancelSubClick() {
//取消订阅内容
if (mCurrentClickAlbum != null && mSubscriptionPresenter != null) {
mSubscriptionPresenter.deleteSubscription(mCurrentClickAlbum);
}
}
@Override
public void onGiveUoClick() {
//放弃取消订阅
}
}
SubscriptionPresenter的代码如下:
package com.example.himalaya.presenters;
import com.example.himalaya.base.BaseApplication;
import com.example.himalaya.data.ISubDaoCallback;
import com.example.himalaya.data.SubscriptionDao;
import com.example.himalaya.interfaces.ISubscriptionCallback;
import com.example.himalaya.interfaces.ISubscriptionPresenter;
import com.example.himalaya.utils.Constants;
import com.example.himalaya.utils.LogUtil;
import com.ximalaya.ting.android.opensdk.model.album.Album;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import io.reactivex.rxjava3.core.Observable;
import io.reactivex.rxjava3.core.ObservableEmitter;
import io.reactivex.rxjava3.core.ObservableOnSubscribe;
import io.reactivex.rxjava3.schedulers.Schedulers;
public class SubscriptionPresenter implements ISubscriptionPresenter, ISubDaoCallback {
private static final String TAG = "SubscriptionPresenter";
private final SubscriptionDao mSubscriptionDao;
private Map<Long, Album> mData = new HashMap<>();
private List<ISubscriptionCallback> mCallbacks = new ArrayList<>();
private SubscriptionPresenter() {
mSubscriptionDao = SubscriptionDao.getInstance();
mSubscriptionDao.setCallback(this);
}
private void listSubscriptions() {
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
//只调用,不处理结果
if (mSubscriptionDao != null) {
mSubscriptionDao.listAlbums();
}
}
}).subscribeOn(Schedulers.io()).subscribe();
}
private static SubscriptionPresenter sInstance = null;
public static ISubscriptionPresenter getInstance() {
if (sInstance == null) {
synchronized (SubscriptionPresenter.class) {
sInstance = new SubscriptionPresenter();
}
}
return sInstance;
}
@Override
public void addSubscription(final Album album) {
//判断当前的订阅数量,不能超过100
if (mData.size() >= Constants.MAX_SUB_COUNT) {
//给出提示
for (ISubscriptionCallback callback : mCallbacks) {
callback.onSubFull();
}
return;
}
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
if (mSubscriptionDao != null) {
mSubscriptionDao.addAlbum(album);
}
}
}).subscribeOn(Schedulers.io()).subscribe();
}
@Override
public void deleteSubscription(final Album album) {
Observable.create(new ObservableOnSubscribe<Object>() {
@Override
public void subscribe(ObservableEmitter<Object> emitter) throws Exception {
if (mSubscriptionDao != null) {
mSubscriptionDao.delAlbum(album);
}
}
}).subscribeOn(Schedulers.io()).subscribe();
}
@Override
public void getSubscriptionList() {
listSubscriptions();
}
@Override
public boolean isSub(Album album) {
Album result = mData.get(album.getId());
//不为空,表示已经订阅
return result != null;
}
@Override
public void registerViewCallback(ISubscriptionCallback iSubscriptionCallback) {
if (!mCallbacks.contains(iSubscriptionCallback)) {
mCallbacks.add(iSubscriptionCallback);
}
}
@Override
public void unRegisterViewCallback(ISubscriptionCallback iSubscriptionCallback) {
mCallbacks.remove(iSubscriptionCallback);
}
@Override
public void onAddResults(final boolean isSuccess) {
LogUtil.d(TAG, "listSubscriptions after add...");
listSubscriptions();
//添加结果的回调
BaseApplication.getHandler().post(new Runnable() {
@Override
public void run() {
LogUtil.d(TAG, "update ui for add result.");
for (ISubscriptionCallback callback : mCallbacks) {
callback.onAddResult(isSuccess);
}
}
});
}
@Override
public void onDelResult(final boolean isSuccess) {
listSubscriptions();
//删除订阅的回调
BaseApplication.getHandler().post(new Runnable() {
@Override
public void run() {
for (ISubscriptionCallback callback : mCallbacks) {
callback.onDeleteResult(isSuccess);
}
}
});
}
@Override
public void onSubListLoaded(final List<Album> result) {
//加载数据的回调
mData.clear();
for (Album album : result) {
mData.put(album.getId(), album);
}
//通知UI更新
BaseApplication.getHandler().post(new Runnable() {
@Override
public void run() {
for (ISubscriptionCallback callback : mCallbacks) {
callback.onSubscriptionsLoaded(result);
}
}
});
}
}
SubscriptionDao代码如下:
package com.example.himalaya.data;
import android.content.ContentValues;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import com.example.himalaya.base.BaseApplication;
import com.example.himalaya.utils.Constants;
import com.example.himalaya.utils.LogUtil;
import com.ximalaya.ting.android.opensdk.model.album.Album;
import com.ximalaya.ting.android.opensdk.model.album.Announcer;
import java.util.ArrayList;
import java.util.List;
public class SubscriptionDao implements ISubDao {
private static final SubscriptionDao ourInstance = new SubscriptionDao();
private static final String TAG = "SubscriptionDao";
private final XimalayaDBHelper mXimalayaDBHelper;
private ISubDaoCallback mCallback = null;
public static SubscriptionDao getInstance() {
return ourInstance;
}
private SubscriptionDao() {
mXimalayaDBHelper = new XimalayaDBHelper(BaseApplication.getAppContext());
}
@Override
public void setCallback(ISubDaoCallback callback) {
this.mCallback = callback;
}
@Override
public void addAlbum(Album album) {
SQLiteDatabase db = null;
boolean isAddSuccess = false;
try {
db = mXimalayaDBHelper.getWritableDatabase();
db.beginTransaction();
ContentValues contentValues = new ContentValues();
//封装数据
contentValues.put(Constants.SUB_COVER_URL, album.getCoverUrlLarge());
contentValues.put(Constants.SUB_TITLE, album.getAlbumTitle());
contentValues.put(Constants.SUB_DESCRIPTION, album.getAlbumIntro());
contentValues.put(Constants.SUB_TRACKS_COUNT, album.getIncludeTrackCount());
contentValues.put(Constants.SUB_PLAY_COUNT, album.getPlayCount());
contentValues.put(Constants.SUB_AUTHOR_NAME, album.getAnnouncer().getNickname());
contentValues.put(Constants.SUB_ALBUM_ID, album.getId());
//插入数据
db.insert(Constants.SUB_TB_NAME, null, contentValues);
db.setTransactionSuccessful();
isAddSuccess = true;
} catch (Exception e) {
e.printStackTrace();
isAddSuccess = false;
} finally {
if (db != null) {
db.endTransaction();
db.close();
}
if (mCallback != null) {
mCallback.onAddResults(isAddSuccess);
}
}
}
@Override
public void delAlbum(Album album) {
SQLiteDatabase db = null;
boolean isDeleteSuccess = false;
try {
db = mXimalayaDBHelper.getWritableDatabase();
db.beginTransaction();
int delete = db.delete(Constants.SUB_TB_NAME, Constants.SUB_ALBUM_ID + "=?", new String[]{album.getId() + ""});
LogUtil.d(TAG, "delete -- > " + delete);
db.setTransactionSuccessful();
isDeleteSuccess = true;
} catch (Exception e) {
e.printStackTrace();
isDeleteSuccess = false;
} finally {
if (db != null) {
db.endTransaction();
db.close();
}
if (mCallback != null) {
mCallback.onDelResult(isDeleteSuccess);
}
}
}
@Override
public void listAlbums() {
SQLiteDatabase db = null;
List<Album> result = new ArrayList<>();
try {
db = mXimalayaDBHelper.getReadableDatabase();
db.beginTransaction();
Cursor query = db.query(Constants.SUB_TB_NAME, null, null, null, null, null, "_id desc");
//封装数据
while (query.moveToNext()) {
Album album = new Album();
//封面图片
String coverUrl = query.getString(query.getColumnIndex(Constants.SUB_COVER_URL));
album.setCoverUrlLarge(coverUrl);
//
String title = query.getString(query.getColumnIndex(Constants.SUB_TITLE));
album.setAlbumTitle(title);
//
String description = query.getString(query.getColumnIndex(Constants.SUB_DESCRIPTION));
album.setAlbumIntro(description);
//
int tracksCount = query.getInt(query.getColumnIndex(Constants.SUB_TRACKS_COUNT));
album.setIncludeTrackCount(tracksCount);
//
int playCount = query.getInt(query.getColumnIndex(Constants.SUB_PLAY_COUNT));
album.setPlayCount(playCount);
//
int albumId = query.getInt(query.getColumnIndex(Constants.SUB_ALBUM_ID));
album.setId(albumId);
String authorName = query.getString(query.getColumnIndex(Constants.SUB_AUTHOR_NAME));
Announcer announcer = new Announcer();
announcer.setNickname(authorName);
album.setAnnouncer(announcer);
result.add(album);
}
query.close();
db.setTransactionSuccessful();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (db != null) {
db.endTransaction();
db.close();
}
//把数据通知出去
if (mCallback != null) {
mCallback.onSubListLoaded(result);
}
}
}
}
Constants的代码如下:
package com.example.himalaya.utils;
public class Constants {
//获取推荐列表的专辑数量
public static int COUNT_RECOMMEND = 50;
//默认列表请求数量
public static int COUNT_DEFAULT = 50;
//热词的数量
public static int COUNT_HOT_WORD = 10;
//数据库相关的常量
public static final String DB_NAME = "ximala.db";
//数据库的版本
public static final int DB_VERSION_CODE = 1;
//订阅的表名
public static final String SUB_TB_NAME = "tb_subscription";
public static final String SUB_ID = "_id";
public static final String SUB_COVER_URL = "coverUrl";
public static final String SUB_TITLE = "title";
public static final String SUB_DESCRIPTION = "description";
public static final String SUB_PLAY_COUNT = "playCount";
public static final String SUB_TRACKS_COUNT = "tracksCount";
public static final String SUB_AUTHOR_NAME = "authorName";
public static final String SUB_ALBUM_ID = "albumId";
//最多订阅个数100
public static final int MAX_SUB_COUNT = 100;
//历史记录的表名
public static final String HISTORY_TB_NAME = "tb_history";
public static final String HISTORY_ID = "_id";
public static final String HISTORY_TRACK_ID = "historyTrackId";
public static final String HISTORY_TITLE = "historyTitle";
public static final String HISTORY_PLAY_COUNT = "historyPlayCount";
public static final String HISTORY_DURATION = "historyDuration";
public static final String HISTORY_UPDATE_TIME = "historyUpdateTime";
public static final String HISTORY_COVER = "historyCover";
}
您的每一个用心回答,都会让这个世界变得更美好一些!