diff --git a/zhuike/build.gradle b/zhuike/build.gradle index 7b043b0..1863be4 100644 --- a/zhuike/build.gradle +++ b/zhuike/build.gradle @@ -63,7 +63,6 @@ dependencies { // annotationProcessor 'com.google.dagger:dagger-compiler:2.11' implementation 'com.youth.banner:banner:1.4.10' api 'com.github.bumptech.glide:glide:4.6.1' - api 'org.xutils:xutils:3.5.0' implementation 'com.google.code.gson:gson:2.8.5' // implementation 'com.viewpagerindicator:library:2.4.1' //implementation 'com.github.auv1107:tablayout-android:-SNAPSHOT' @@ -78,4 +77,9 @@ dependencies { implementation 'com.squareup.okhttp3:logging-interceptor:3.14.0' implementation 'com.packetzoom:pz-okhttp3-interceptor:3.2.43' api 'io.reactivex.rxjava2:rxandroid:2.1.0' + implementation 'com.github.bumptech.glide:glide:4.9.0' + implementation 'jp.wasabeef:glide-transformations:2.0.1' + implementation 'com.timqi.collapsibletextview:library:1.1.2' + // implementation 'com.ms-square:expandableTextView:0.1.4' + } diff --git a/zhuike/src/main/java/com/novelbook/android/Activity_base.java b/zhuike/src/main/java/com/novelbook/android/Activity_base.java index 41f98d6..a0107e6 100644 --- a/zhuike/src/main/java/com/novelbook/android/Activity_base.java +++ b/zhuike/src/main/java/com/novelbook/android/Activity_base.java @@ -78,15 +78,15 @@ public abstract class Activity_base extends AppCompatActivity { protected abstract void initData() ; - protected BookListAdapter getBookListAdapter(List mDatas){ - BookListAdapter mAdapter = new BookListAdapter(this ,mDatas,R.layout.recycle_list_item_horizon,new OnItemClickListener() + protected BookListAdapter getBookListAdapter(List mDatas,int itemResourceId){ + BookListAdapter mAdapter = new BookListAdapter(this ,mDatas,itemResourceId,new OnItemClickListener() { @Override public void onItemClick(View view, int position) { - showBook("射雕" +position); - + // showBook("射雕" +position); + showBookDetail(mDatas.get(position)); } @Override @@ -105,7 +105,12 @@ public abstract class Activity_base extends AppCompatActivity { return mAdapter; } + void showBookDetail(Novel book) { + Intent intent = new Intent(this, BookActivity.class); + intent.putExtra(BookActivity.EXTRA_BOOK,book); + startActivity(intent); + } @Override public boolean onOptionsItemSelected(MenuItem item) { diff --git a/zhuike/src/main/java/com/novelbook/android/Activity_paihangbang.java b/zhuike/src/main/java/com/novelbook/android/Activity_paihangbang.java index ab9e632..650ca06 100644 --- a/zhuike/src/main/java/com/novelbook/android/Activity_paihangbang.java +++ b/zhuike/src/main/java/com/novelbook/android/Activity_paihangbang.java @@ -28,6 +28,7 @@ public static String TAG ="com.novelbook.android.paihangbang"; SlidingTabLayout tabLayout; public static String EXTR_FN="fn"; public static String EXTR_TITLE="title"; + public static String EXTR_BANGDAN ="bangdan"; private ArrayList mFragments; ArrayList mList; String[] mTitle; @@ -42,8 +43,8 @@ public static String TAG ="com.novelbook.android.paihangbang"; initTabs(); } - - + String bangdan; + String fn; @Override protected void setTitle() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { @@ -51,11 +52,14 @@ public static String TAG ="com.novelbook.android.paihangbang"; localLayoutParams.flags = (WindowManager.LayoutParams.FLAG_TRANSLUCENT_STATUS | localLayoutParams.flags); } + fn = getIntent().getStringExtra(EXTR_FN); + + bangdan = getIntent().getStringExtra(EXTR_BANGDAN); String title = getIntent().getStringExtra(EXTR_TITLE); - String fn = getIntent().getStringExtra(EXTR_FN); - title+="榜"; + + //title+="榜"; this.setTitle(title); } @@ -70,11 +74,16 @@ public static String TAG ="com.novelbook.android.paihangbang"; void initTabs() { if(mFragments ==null || mFragments.size() ==0){ - mTitle = new String[]{"周榜", "月榜", "总榜"}; + // mTitle = new String[]{"周榜", "月榜", "总榜"}; mFragments = new ArrayList<>(); - mFragments.add( Fragment_booklist.newInstance("a",1)); //目的地不清楚 - mFragments.add(new Fragment_booklist()); - mFragments.add(new Fragment_booklist()); + mFragments.add( Fragment_booklist.newInstance(fn,bangdan)); //首页更多 + + + + + + // mFragments.add(new Fragment_booklist()); + // mFragments.add(new Fragment_booklist()); } Log.d(TAG,"set viewPager adapter "); @@ -89,13 +98,14 @@ public static String TAG ="com.novelbook.android.paihangbang"; return mFragments.size(); } //ViewPager与TabLayout绑定后,这里获取到PageTitle就是Tab的Text - @Override - public CharSequence getPageTitle(int position) { - return mTitle[position]; - } + // @Override + // public CharSequence getPageTitle(int position) { + // return mTitle[position]; + // } }; mViewpager.setAdapter(mAdapter); - tabLayout.setViewPager(mViewpager); + //tabLayout.setViewPager(mViewpager); + tabLayout.setVisibility(View.GONE); // tabLayout.setViewPager(mViewpager, mTitle, activity, mFragments); mViewpager.setCurrentItem(0); } diff --git a/zhuike/src/main/java/com/novelbook/android/Activity_shudan.java b/zhuike/src/main/java/com/novelbook/android/Activity_shudan.java index 5c42e6a..633144d 100644 --- a/zhuike/src/main/java/com/novelbook/android/Activity_shudan.java +++ b/zhuike/src/main/java/com/novelbook/android/Activity_shudan.java @@ -24,7 +24,7 @@ public class Activity_shudan extends Activity_base { @Override protected void initData() { mData = getFakeData(5); - mAdapter = getBookListAdapter( mData); + mAdapter = getBookListAdapter( mData,R.layout.recycle_list_item_horizon); } diff --git a/zhuike/src/main/java/com/novelbook/android/BookActivity.java b/zhuike/src/main/java/com/novelbook/android/BookActivity.java index e698950..d7733f1 100644 --- a/zhuike/src/main/java/com/novelbook/android/BookActivity.java +++ b/zhuike/src/main/java/com/novelbook/android/BookActivity.java @@ -7,14 +7,17 @@ import android.content.Context; import android.content.DialogInterface; import android.content.Intent; import android.content.IntentFilter; +import android.net.Uri; import android.os.Build; import android.os.Handler; import android.os.Message; +import android.support.v7.widget.GridLayoutManager; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; import android.support.v7.widget.Toolbar; import android.text.TextUtils; import android.util.Log; +import android.view.Gravity; import android.view.MenuItem; import android.view.View; import android.widget.Button; @@ -41,6 +44,9 @@ import com.novelbook.android.service.ChapterDownloadSvrc; import com.novelbook.android.service.MyIntentService; import com.novelbook.android.service.ServiceDownload; import com.novelbook.android.utils.BookUtil; +import com.novelbook.android.utils.CommonUtil; +import com.novelbook.android.utils.Constants; +import com.novelbook.android.utils.GaoSiTransForm; import com.novelbook.android.utils.GsonUtil; import com.novelbook.android.utils.ImageUtil; import com.novelbook.android.utils.MyImageLoader; @@ -54,6 +60,9 @@ import org.litepal.LitePal; import java.io.File; import java.io.IOException; +import java.net.MalformedURLException; +import java.net.URI; +import java.net.URL; import java.time.LocalDateTime; import java.util.ArrayList; import java.util.Date; @@ -61,6 +70,7 @@ import java.util.List; import butterknife.BindView; import butterknife.OnClick; +import jp.wasabeef.glide.transformations.BlurTransformation; import okhttp3.Call; import okhttp3.Callback; import okhttp3.Request; @@ -77,16 +87,21 @@ public class BookActivity extends Activity_base { private Novel mNovel; private Chapter mChapter; static String TAG = BookActivity.class.getSimpleName(); - BookListAdapter mAdapter; + BookListAdapter mAdapterAuthor; // private BookListAdapter mAdapter; - private List mData; + private List mDataAuthor; + + BookListAdapter mAdapterRelated; + // private BookListAdapter mAdapter; + private List mDataRelated; ; - private Gson gson = new Gson(); + + //private Gson gson = new Gson(); private List mChapters = new ArrayList<>(); - @BindView(R.id.toolbar) - Toolbar toolbar; + // @BindView(R.id.toolbar) +// Toolbar toolbar; @BindView(R.id.rvBooklist) - RecyclerView rvBooklist; + RecyclerView rvBooklistAuthor; @BindView(R.id.btnShelf) Button btnShelf; @BindView(R.id.imageView) @@ -100,15 +115,23 @@ public class BookActivity extends Activity_base { @BindView(R.id.category) TextView txtCategory; @BindView(R.id.txtDesc2) - TextView txtDesc2; + com.timqi.collapsibletextview.CollapsibleTextView txtDesc2; @BindView(R.id.txtLatestCate) TextView txtLatestCate; @BindView(R.id.btnCacheBook) Button btnCach; - + @BindView(R.id.rvBooklistRelated) + RecyclerView rvBooklistRelated; Intent serviceIntent ; + @BindView(R.id.imageViewHead) + ImageView imageViewHead; - + @BindView(R.id.tvAuthorMore) + TextView tvAuthorMore; + @BindView(R.id.tvTonglei) + TextView tvTonglei; + @BindView(R.id.txtLatestUpdate) + TextView tvLastUpdate; public Intent getSvrIntent(){ if(serviceIntent ==null){ serviceIntent= new Intent(this, ServiceDownload.class); @@ -123,12 +146,17 @@ public class BookActivity extends Activity_base { @Override protected void initViews() { - initialBookList(); + rvBooklistRelated.setVisibility(View.GONE); + rvBooklistAuthor.setVisibility(View.GONE); + tvTonglei.setVisibility(View.GONE); + tvAuthorMore.setText( ""); } @Override protected void setupToolbar() { super.setupToolbar(); + toolbar.setTitleMarginBottom(1); + toolbar.setTitleTextAppearance(this,R.style.TitleText); toolbar.inflateMenu(R.menu.menu_book);//设置右上角的填充菜单 toolbar.setOnMenuItemClickListener(new Toolbar.OnMenuItemClickListener() { @Override @@ -164,8 +192,7 @@ public class BookActivity extends Activity_base { setBookInfo();//set title ,data from novel list getBookInfo(); - mData = getFakeData(5); - mAdapter = getBookListAdapter(mData); + } /** @@ -175,8 +202,36 @@ public class BookActivity extends Activity_base { } + private void setNovelsSameAuthor(){ + if(mDataAuthor!=null && mDataAuthor.size() >0){ + tvAuthorMore.setText(mNovel.getAuthor()+ " 还写过"); + + } else{ + return; + } + rvBooklistAuthor.setVisibility(View.VISIBLE); + mAdapterAuthor = getBookListAdapter(mDataAuthor,R.layout.recycle_list_item_horizon); + rvBooklistAuthor.setLayoutManager(new LinearLayoutManager(this)); + rvBooklistAuthor.setAdapter(mAdapterAuthor); + + } + private void setNovelsRelated(){ + + if(mDataRelated!=null && mDataRelated.size() >0){ + tvTonglei.setVisibility(View.VISIBLE); + + }else + { + return; + } + rvBooklistRelated.setVisibility(View.VISIBLE); + mAdapterRelated = getBookListAdapter(mDataRelated,R.layout.recycle_list_item); + rvBooklistRelated.setLayoutManager(new GridLayoutManager(this, Constants.NOVEL_SPAN_CNT)); + + rvBooklistRelated.setAdapter(mAdapterRelated); + } /** * 设置服务器传来的详细信息 */ @@ -187,13 +242,39 @@ public class BookActivity extends Activity_base { this.txtCategory.setText(mNovel.getNovelType()); this.txtDesc.setText(mNovel.getDesc ()); this.txtTitle.setText(mNovel.getName()); - this.txtDesc2.setText(mNovel.getDesc ()); - this.txtLatestCate.setText(mNovel.getChapterName()); - if (mNovel.getLastUpateTime() > 0) { - this.txtLatestCate.setText(new Date(mNovel.getLastUpateTime()).toString() + "\n" + txtLatestCate.getText()); - } - loadImageView(mNovel.getCover(),imageView); + this.txtDesc2.setFullString(mNovel.getDesc ()); + txtDesc2.setCollapsedLines(2); + // txtDesc2.setSuffixColor(R.color.colorPrimary); + + // txtDesc2.setExpanded(false); + // txtDesc2.setSuffixTrigger(false); + this.txtLatestCate.setText(mNovel.getChapterName()); + tvLastUpdate.setText(CommonUtil.getDateString( mNovel.getLastUpateTime())); + loadImageView(mNovel.getCover(),imageView); + gaosiHeadPic(); + } + void gaosiHeadPic(){ + //new BlurTransformation(BookActivity.this, 10)).into(mImageView); + /* URL url = null; + try { + url = new URL( NetUtil.getCoverUrl(mNovel.getCover())); + } catch (MalformedURLException e) { + e.printStackTrace(); + }*/ + String a =Uri.decode(NetUtil.getCoverUrl(mNovel.getCover())); + Glide.with(BookActivity.this) + .load( Uri.decode(NetUtil.getCoverUrl(mNovel.getCover()))) + .dontAnimate() + .error(R.mipmap.side_bg2) + .transform(new GaoSiTransForm(this, 50, 3)) // "14":模糊度;"3":图片缩放3倍后再进行模糊 + .into(imageViewHead); + + + + + // Glide.with(this).load(url) .transform(new BlurTransformation(BookActivity.this, 10)).into(imageViewHead); + // Glide.with(this).load(imageView.getDrawable()).transform(new BlurTransformation(BookActivity.this, 10)).into(imageViewHead); } void setShelfButtonText() { @@ -243,14 +324,14 @@ public class BookActivity extends Activity_base { setBookDetailInfo(); } else if (msg.what == 2) //准备数据,启动service { - hideProgress(); + Toast.makeText(BookActivity.this, "已加入下载队列1", Toast.LENGTH_LONG).show(); } else if (msg.what == 3) { Toast.makeText(BookActivity.this, "获取目录信息失败,下载失败", Toast.LENGTH_LONG).show(); } - + hideProgress(); } }; @@ -460,6 +541,50 @@ public class BookActivity extends Activity_base { } }, BookActivity.this)); + BookSubscribe.getNovelsRelated(novelId, Constants.SEX, new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { + @Override + public void onSuccess(String result) { + //成功 + try { + + mDataRelated = GsonUtil. parserJsonArray(result,Constants.BLOCK_TITLE_NOVELS); + setNovelsRelated(); + } catch (Exception e) { + e.printStackTrace(); + } + + } + + @Override + public void onFault(String errorMsg) { + + + } + }, BookActivity.this)); + + BookSubscribe.getNovelsSameAuthor(novelId, Constants.SEX, new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { + @Override + public void onSuccess(String result) { + //成功 + try { + + mDataAuthor = GsonUtil. parserJsonArray(result,Constants.BLOCK_TITLE_NOVELS); + setNovelsSameAuthor(); + } catch (Exception e) { + e.printStackTrace(); + } + + + } + + @Override + public void onFault(String errorMsg) { + + + } + }, BookActivity.this)); + + } /* void readChapters( String url){ @@ -530,11 +655,6 @@ void onResponseProcess( String content ,String url){ //----------------绑定列表 - void initialBookList() { - - rvBooklist.setLayoutManager(new LinearLayoutManager(this)); - rvBooklist.setAdapter(mAdapter); - } @Override protected void onResume() { diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java b/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java index 5f524b6..e9fa46a 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/BasicFragment.java @@ -31,6 +31,10 @@ import android.widget.Toast; import com.bumptech.glide.Glide; import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; import com.novelbook.android.Activity_base; import com.novelbook.android.Activity_paihangbang; import com.novelbook.android.Activity_shudan; @@ -55,6 +59,7 @@ import org.w3c.dom.Text; import java.io.File; import java.lang.reflect.Field; import java.util.ArrayList; +import java.util.Iterator; import java.util.List; import butterknife.BindView; @@ -134,7 +139,7 @@ public abstract class BasicFragment extends Fragment { { - Toast.makeText(getActivity(), " ", Toast.LENGTH_LONG).show(); + Toast.makeText(getActivity(), "数据请求失败 ", Toast.LENGTH_LONG).show(); } else if (msg.what == 3) { Toast.makeText(getActivity(), " ", Toast.LENGTH_LONG).show(); @@ -296,12 +301,30 @@ public abstract class BasicFragment extends Fragment { NovelBlock nb = (NovelBlock) obj; Intent intent = new Intent(activity, Activity_paihangbang.class); - intent.putExtra(Activity_paihangbang.EXTR_FN,nb.getFn() ); - intent.putExtra(Activity_paihangbang.EXTR_TITLE,nb.getTitle() ); + String title = TextUtils.isEmpty(nb.getTitle()) ? nb.getName() : nb.getTitle() ; + + intent.putExtra(Activity_paihangbang.EXTR_FN,nb.getFn() ); + intent.putExtra(Activity_paihangbang.EXTR_TITLE,title ); startActivity(intent); } + void showPaihangbang(NovelBlock nb) { //show paihangbang activity + + Intent intent = new Intent(activity, Activity_paihangbang.class); + String title = TextUtils.isEmpty(nb.getTitle()) ? nb.getName() : nb.getTitle() ; + + intent.putExtra(Activity_paihangbang.EXTR_FN,nb.getFn() ); + intent.putExtra(Activity_paihangbang.EXTR_TITLE,title ); + intent.putExtra(Activity_paihangbang.EXTR_BANGDAN,title ); + startActivity(intent); + + } + + protected void loadImageView(String url, ImageView imageView){ ImageUtil.loadImage( getActivity(), url , imageView); } + + + } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java index 8bd984e..9b6b82b 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_bangdan.java @@ -3,13 +3,24 @@ package com.novelbook.android.Fragments; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; +import android.util.Log; import android.view.View; +import android.widget.Toast; import com.novelbook.android.R; +import com.novelbook.android.bean.NovelBlock; import com.novelbook.android.db.Novel; +import com.novelbook.android.netsubscribe.BookSubscribe; +import com.novelbook.android.netutils.OnSuccessAndFaultListener; +import com.novelbook.android.netutils.OnSuccessAndFaultSub; import com.novelbook.android.utils.BandanAdapter; +import com.novelbook.android.utils.Constants; +import com.novelbook.android.utils.GsonUtil; import com.novelbook.android.utils.OnItemClickListener; +import org.json.JSONObject; + import java.util.List; import butterknife.BindView; @@ -21,7 +32,8 @@ public class Fragment_bangdan extends BasicFragment { private static final String ARG_PARAM1 = "param1"; private static final String ARG_PARAM2 = "param2"; private BandanAdapter mAdapter; - private List mData; + private List mBlocks; + // private List mData; @BindView(R.id.rvBangdan) RecyclerView rvBandan; @@ -35,6 +47,39 @@ public class Fragment_bangdan extends BasicFragment { } @Override protected void fillData() { + + if(mBlocks==null){ + return; + } + mAdapter = new BandanAdapter(activity ,mBlocks,R.layout.recycle_list_item_bangdan,new OnItemClickListener() + { + + @Override + public void onItemClick(View view, int position) + { + showPaihangbang(mBlocks.get(position)); + + // Toast.makeText(getActivity(),"待。。。。。做",Toast.LENGTH_LONG).show(); + } + + @Override + public void onItemLongClick(View view, int position) + { + // initDialog(position); + // mAdapter.removeData(position); + } + @Override + public void onLinearOutClick(View view, int blockId,int novelIndex) { + // Toast.makeText(activity, "book "+ bookId + " clicked", Toast.LENGTH_SHORT).show(); + showBookDetail(mBlocks.get(blockId).getNs().get(novelIndex)); + //showPaihangbang("分类名称" +position); + Log.d(TAG,String.format("clicked: position %s,lineId %s",novelIndex,blockId)); + + // openBook(); + } + }); + initialBookList(); + } protected void processArguments(){ @@ -51,38 +96,38 @@ public class Fragment_bangdan extends BasicFragment { @Override public void initData() { - mData = initData(mData,'F'); - mAdapter = new BandanAdapter(activity ,mData,R.layout.recycle_list_item_bangdan,new OnItemClickListener() - { - - @Override - public void onItemClick(View view, int position) - { - showPaihangbang("分类名称" +position); - - } - - @Override - public void onItemLongClick(View view, int position) - { - // initDialog(position); - // mAdapter.removeData(position); - } - @Override - public void onLinearOutClick(View view, int position,int lineId) { - // Toast.makeText(activity, "book "+ bookId + " clicked", Toast.LENGTH_SHORT).show(); + showProgressDialog(true, "正在加载"); - showBookDetail(mData.get(position)); - // openBook(); - } - }); + BookSubscribe.getSiteRanks( Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { + @Override + public void onSuccess(String result) { + + // mFirstPage= gson.fromJson(result, FirstPage.class); + try { + mBlocks = GsonUtil.parserNovleBlocks(result,"ranks"); + } catch (Exception e) { + e.printStackTrace(); + Log.d(TAG, "error on : " + e.getMessage()); + } + handler.sendEmptyMessage(1); + + } + + @Override + public void onFault(String errorMsg) { + //失败 + Log.d(TAG, "error on : " + errorMsg); + handler.sendEmptyMessage(1); + } + }, getActivity())); + } public void initViews(){ - initialBookList(); + } void initialBookList() { diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java index e993bd6..814f649 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_booklist.java @@ -3,6 +3,7 @@ package com.novelbook.android.Fragments; import android.os.Bundle; import android.support.v7.widget.LinearLayoutManager; import android.support.v7.widget.RecyclerView; +import android.text.TextUtils; import android.util.Log; import android.view.View; import android.widget.Toast; @@ -18,6 +19,7 @@ import com.novelbook.android.netsubscribe.BookSubscribe; import com.novelbook.android.netutils.OnSuccessAndFaultListener; import com.novelbook.android.netutils.OnSuccessAndFaultSub; import com.novelbook.android.utils.Constants; +import com.novelbook.android.utils.GsonUtil; import com.novelbook.android.utils.OnItemClickListener; import com.novelbook.android.adapter.BookListAdapter; @@ -34,11 +36,18 @@ import butterknife.BindView; public class Fragment_booklist extends BasicFragment { private static final String EXTR_CATE ="cate" ; private static final String EXTR_PROGRESS ="progress" ; + + private static final String EXTR_FN ="fn" ; + private static final String EXTR_BANGDAN ="bangdan" ; private BookListAdapter mAdapter; // private BookListAdapter mAdapter; private List mData;; private String cate; private int progress; + + private String fn; + private String bangdan; + private int pageNo=1; private int totalCount; private int pageCount; @@ -48,7 +57,14 @@ public class Fragment_booklist extends BasicFragment { public Fragment_booklist() { // Required empty public constructor } - + public static Fragment_booklist newInstance(String fn,String bangdan) { + Fragment_booklist fragment = new Fragment_booklist(); + Bundle args = new Bundle(); + args.putString(EXTR_FN,fn); + args.putString(EXTR_BANGDAN,bangdan); + fragment.setArguments(args); + return fragment; + } public static Fragment_booklist newInstance(String noveType,int progress) { Fragment_booklist fragment = new Fragment_booklist(); Bundle args = new Bundle(); @@ -60,48 +76,27 @@ public class Fragment_booklist extends BasicFragment { protected void processArguments(){ if (getArguments() != null) { Bundle bundle = getArguments() ; + bangdan =bundle.getString(EXTR_BANGDAN); + fn= bundle.getString(EXTR_FN); + + if(!TextUtils.isEmpty((fn))){ + return; + } cate = bundle.getString(EXTR_CATE); progress = bundle.getInt(EXTR_PROGRESS); + } } - public List parserJsonArray(String strJson) { - List list = new ArrayList(); - //创建一个Gson对象 - // Gson gson = new Gson(); - //创建一个JsonParser - JsonParser parser = new JsonParser(); - //通过JsonParser对象可以把json格式的字符串解析成一个JsonElement对象 - JsonElement el = parser.parse(strJson); - - //把JsonElement对象转换成JsonObject - JsonObject jsonObj = null; - if (el.isJsonObject()) { - jsonObj = el.getAsJsonObject(); - } - - - //把JsonElement对象转换成JsonArray - JsonArray jsonArray = null; - if (el.isJsonArray()) { - jsonArray = el.getAsJsonArray(); - } - - //遍历JsonArray对象 - Iterator it = jsonArray.iterator(); - while (it.hasNext()) { - JsonElement e = (JsonElement) it.next(); - //JsonElement转换为JavaBean对象 - list.add((Novel) gson.fromJson(e, Novel.class)); - } - return list; - } @Override protected void fillData() { - mAdapter = new BookListAdapter(activity, mData, R.layout.recycle_list_item_shudan, new OnItemClickListener() { + if(mData==null){ + return; + } + mAdapter = new BookListAdapter(activity, mData, R.layout.recycle_list_item_horizon, new OnItemClickListener() { @Override public void onItemClick(View view, int position) { @@ -133,15 +128,76 @@ public class Fragment_booklist extends BasicFragment { public void initData() { showProgressDialog(true, "正在加载"); + + Log.d(TAG,String.format("fn is %s",fn) ); + + if(!TextUtils.isEmpty(bangdan) && !TextUtils.isEmpty(fn)){ //榜单 + + BookSubscribe.getSiteRankDetail(fn,pageNo,Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { + @Override + public void onSuccess(String result) { + + try { + JSONObject jsonObject = new JSONObject(result); + String resultstr = jsonObject.getString("rank") ; + + mData = GsonUtil. parserJsonArray(resultstr,Constants.BLOCK_TITLE_NOVELS); + } catch (Exception e) { + e.printStackTrace(); + } + handler.sendEmptyMessage(1); + + } + + @Override + public void onFault(String errorMsg) { + //失败 + Log.d(TAG, "error on get firstpage: " + errorMsg); + handler.sendEmptyMessage(1); + } + }, getActivity())); + + + }else if(!TextUtils.isEmpty(fn)){ //首页 更多 + + BookSubscribe.getNovelPaihang(fn,Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { + @Override + public void onSuccess(String result) { + + // mFirstPage= gson.fromJson(result, FirstPage.class); + try { + + mData = GsonUtil. parserJsonArray(result,Constants.BLOCK_TITLE_NOVELS); + } catch (Exception e) { + e.printStackTrace(); + } + handler.sendEmptyMessage(1); + + } + + @Override + public void onFault(String errorMsg) { + //失败 + Log.d(TAG, "error on get firstpage: " + errorMsg); + handler.sendEmptyMessage(1); + } + }, getActivity())); + + + + } + + else + + BookSubscribe.getCateNovelList(cate,pageNo,Constants.SEX,progress,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { @Override public void onSuccess(String result) { // mFirstPage= gson.fromJson(result, FirstPage.class); try { - JSONObject jsonObject = new JSONObject(result); - String resultstr = jsonObject.getString("ns"); - mData = parserJsonArray(resultstr); + + mData = GsonUtil. parserJsonArray(result,Constants.BLOCK_TITLE_NOVELS); } catch (Exception e) { e.printStackTrace(); } diff --git a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java index ec666c2..a7e8e1e 100644 --- a/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java +++ b/zhuike/src/main/java/com/novelbook/android/Fragments/Fragment_jingxuan.java @@ -33,7 +33,9 @@ import com.novelbook.android.db.SiteRule; import com.novelbook.android.netsubscribe.BookSubscribe; import com.novelbook.android.netutils.OnSuccessAndFaultListener; import com.novelbook.android.netutils.OnSuccessAndFaultSub; +import com.novelbook.android.utils.Constants; import com.novelbook.android.utils.CyclePageIndicator; +import com.novelbook.android.utils.GsonUtil; import com.novelbook.android.utils.ImageUtil; import com.novelbook.android.utils.MyViewPager; import com.novelbook.android.utils.OnItemClickListener; @@ -137,52 +139,20 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener return R.layout.fragment_jingxuan; } - public List parserJsonArray(String strJson) { - List list = new ArrayList(); - //创建一个Gson对象 - // Gson gson = new Gson(); - //创建一个JsonParser - JsonParser parser = new JsonParser(); - //通过JsonParser对象可以把json格式的字符串解析成一个JsonElement对象 - JsonElement el = parser.parse(strJson); - - //把JsonElement对象转换成JsonObject - JsonObject jsonObj = null; - if (el.isJsonObject()) { - jsonObj = el.getAsJsonObject(); - } - - - //把JsonElement对象转换成JsonArray - JsonArray jsonArray = null; - if (el.isJsonArray()) { - jsonArray = el.getAsJsonArray(); - } - - //遍历JsonArray对象 - Iterator it = jsonArray.iterator(); - while (it.hasNext()) { - JsonElement e = (JsonElement) it.next(); - //JsonElement转换为JavaBean对象 - list.add((NovelBlock) gson.fromJson(e, NovelBlock.class)); - } - return list; - } @Override public void initData() { showProgressDialog(true, "正在加载"); - BookSubscribe.getFirstPage(new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { + BookSubscribe.getFirstPage(Constants.SEX,new OnSuccessAndFaultSub(new OnSuccessAndFaultListener() { @Override public void onSuccess(String result) { // mFirstPage= gson.fromJson(result, FirstPage.class); try { - JSONObject jsonObject = new JSONObject(result); - String resultstr = jsonObject.getString("blocks"); - mBlocks = parserJsonArray(resultstr); + + mBlocks = GsonUtil.parserNovleBlocks(result,"blocks"); } catch (Exception e) { e.printStackTrace(); } @@ -474,9 +444,13 @@ public class Fragment_jingxuan extends BasicFragment implements OnBannerListener @BindView(R.id.rvFinishG) RecyclerView rvFinishG; + int getSpanCnt(){ + return Constants.NOVEL_SPAN_CNT; + } + void initialBookList() { - int spanCnt =4; + int spanCnt =getSpanCnt(); OnItemClickListener onItemClickListener = new OnItemClickListener() { @Override diff --git a/zhuike/src/main/java/com/novelbook/android/Main2Activity.java b/zhuike/src/main/java/com/novelbook/android/Main2Activity.java index 637dc95..69bb3d0 100644 --- a/zhuike/src/main/java/com/novelbook/android/Main2Activity.java +++ b/zhuike/src/main/java/com/novelbook/android/Main2Activity.java @@ -29,9 +29,7 @@ import com.novelbook.android.Fragments.Fragment_Shelf; import com.novelbook.android.Fragments.Fragment_bookStore; import com.novelbook.android.Fragments.Fragment_paihang; -import org.xutils.common.Callback; -import org.xutils.http.RequestParams; -import org.xutils.x; + import butterknife.BindView; import butterknife.ButterKnife; diff --git a/zhuike/src/main/java/com/novelbook/android/MyApp.java b/zhuike/src/main/java/com/novelbook/android/MyApp.java index 400a24b..cca3c26 100644 --- a/zhuike/src/main/java/com/novelbook/android/MyApp.java +++ b/zhuike/src/main/java/com/novelbook/android/MyApp.java @@ -6,7 +6,7 @@ import android.content.Context; import com.novelbook.android.utils.PageFactory; import org.litepal.LitePal; -import org.xutils.x; + import io.alterac.blurkit.BlurKit; @@ -19,8 +19,7 @@ public class MyApp extends Application { Config.createConfig(this); PageFactory.createPageFactory(this); - x.Ext.init(this); - x.Ext.setDebug(false); //输出debug日志,开启会影响性能 + // BlurKit.init(this); LitePal.initialize(this); } diff --git a/zhuike/src/main/java/com/novelbook/android/activity_cates.java b/zhuike/src/main/java/com/novelbook/android/activity_cates.java index 00e38ae..59699bc 100644 --- a/zhuike/src/main/java/com/novelbook/android/activity_cates.java +++ b/zhuike/src/main/java/com/novelbook/android/activity_cates.java @@ -72,7 +72,7 @@ public class activity_cates extends Activity_base { { - Toast.makeText(activity_cates.this, " ", Toast.LENGTH_LONG).show(); + Toast.makeText(activity_cates.this, " 请求失败", Toast.LENGTH_LONG).show(); } else if (msg.what == 3) { Toast.makeText(activity_cates.this, " ", Toast.LENGTH_LONG).show(); @@ -95,7 +95,8 @@ public class activity_cates extends Activity_base { @Override public void onItemClick(View view, int position) { - showCateList(mCataloges.get(position).getName()); + Cataloge cl = cates.get(position); + showCateList(cl.getName()); } }); @@ -178,7 +179,7 @@ public class activity_cates extends Activity_base { public void onFault(String errorMsg) { //失败 Log.d(TAG, "error on get firstpage: " + errorMsg); - handler.sendEmptyMessage(1); + handler.sendEmptyMessage(2); } }, this)); diff --git a/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java b/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java index f9325c5..2cea472 100644 --- a/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java +++ b/zhuike/src/main/java/com/novelbook/android/netapi/HttpApi.java @@ -51,7 +51,7 @@ public interface HttpApi { Observable getNovelRule(@Path("siteDomain") String siteDomain); @GET("page/index") - Observable getFirstPage(); + Observable getFirstPage(@Query("sex") int Sex); //分类的总榜,显示每个小说分类有多少本书 @GET("page/noveltype") @@ -63,7 +63,22 @@ public interface HttpApi { @GET("search/nt/{cate}/{pageno}") Observable getCateNovels(@Path("cate") String cate, @Path("pageno") int pageno, @Query("sex") int sex, @Query("progress") int progress); + //小说排行 http://xiaoshuofenxiang.com/api/page/rank?fn=hot + @GET("page/rank") + Observable getNovelPaihang(@Query("fn") String fn,@Query("sex") int Sex); + //相关小说 http://xiaoshuofenxiang.com/api/n/6/about + @GET("n/{novelId}/about") + Observable getNovelsRelated(@Path("novelId") int novelId,@Query("sex") int Sex); + //同作者其它小说http://xiaoshuofenxiang.com/api/n/7/author + @GET("n/{novelId}/author") + Observable getNovelsSameAuthor(@Path("novelId") int novelId,@Query("sex") int Sex); + //站点榜单http://xiaoshuofenxiang.com/api/page/siteranks?sex=1 + @GET("page/siteranks") + Observable getSiteRanks(@Query("sex") int Sex); + //http://xiaoshuofenxiang.com/api/page/siterank?fn=qidian-yuanchuangfengyunbang&pn=3 + @GET("page/siterank?fn=qidian-yuanchuangfengyunbang&pn=3") + Observable getSiteRankDetail(@Query("fn")String fn,@Query("pn")int pageNo,@Query("sex") int Sex); } diff --git a/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java b/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java index c117779..3ad9622 100644 --- a/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java +++ b/zhuike/src/main/java/com/novelbook/android/netsubscribe/BookSubscribe.java @@ -31,8 +31,8 @@ public class BookSubscribe { HttpMethods.getInstance().toSubscribe(observable, subscriber); } - public static void getFirstPage(DisposableObserver subscriber){ - Observable observable = HttpMethods.getInstance().getHttpApi().getFirstPage(); + public static void getFirstPage(int sex,DisposableObserver subscriber){ + Observable observable = HttpMethods.getInstance().getHttpApi().getFirstPage(sex); HttpMethods.getInstance().toSubscribe(observable, subscriber); } public static void getCates(int sex,DisposableObserver subscriber){ @@ -43,4 +43,28 @@ public class BookSubscribe { Observable observable = HttpMethods.getInstance().getHttpApi().getCateNovels(cate,pageno,sex,progress); HttpMethods.getInstance().toSubscribe(observable, subscriber); } + + public static void getNovelPaihang(String fn,int sex,DisposableObserver subscriber){ + Observable observable = HttpMethods.getInstance().getHttpApi().getNovelPaihang(fn,sex); + HttpMethods.getInstance().toSubscribe(observable, subscriber); + } + + public static void getNovelsRelated(int novelId,int sex,DisposableObserver subscriber){ + Observable observable = HttpMethods.getInstance().getHttpApi().getNovelsRelated(novelId,sex); + HttpMethods.getInstance().toSubscribe(observable, subscriber); + } + + public static void getNovelsSameAuthor(int novelId,int sex,DisposableObserver subscriber){ + Observable observable = HttpMethods.getInstance().getHttpApi().getNovelsSameAuthor(novelId,sex); + HttpMethods.getInstance().toSubscribe(observable, subscriber); + } + + public static void getSiteRanks( int sex,DisposableObserver subscriber){ + Observable observable = HttpMethods.getInstance().getHttpApi().getSiteRanks(sex); + HttpMethods.getInstance().toSubscribe(observable, subscriber); + } + public static void getSiteRankDetail( String fn,int pageNo,int sex,DisposableObserver subscriber){ + Observable observable = HttpMethods.getInstance().getHttpApi().getSiteRankDetail(fn,pageNo,sex); + HttpMethods.getInstance().toSubscribe(observable, subscriber); + } } diff --git a/zhuike/src/main/java/com/novelbook/android/netutils/HttpMethods.java b/zhuike/src/main/java/com/novelbook/android/netutils/HttpMethods.java index d6e963f..712f2d0 100644 --- a/zhuike/src/main/java/com/novelbook/android/netutils/HttpMethods.java +++ b/zhuike/src/main/java/com/novelbook/android/netutils/HttpMethods.java @@ -11,7 +11,7 @@ import com.novelbook.android.utils.CommonUtil; import com.novelbook.android.utils.FileUtils; -import org.xutils.common.util.FileUtil; + import java.io.File; import java.io.IOException; diff --git a/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java b/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java index c2ef711..0ade451 100644 --- a/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java +++ b/zhuike/src/main/java/com/novelbook/android/netutils/OnSuccessAndFaultSub.java @@ -130,7 +130,10 @@ public class OnSuccessAndFaultSub extends DisposableObserver } else if (code == 401) { // ToastManager.showShortToast("请求的地址不存在"); mOnSuccessAndFaultListener.onFault("权限验证错误"); - } else { + } else if(code == 500) { + // ToastManager.showShortToast("请求失败"); + mOnSuccessAndFaultListener.onFault("服务错误"); + }else { // ToastManager.showShortToast("请求失败"); mOnSuccessAndFaultListener.onFault("请求失败"); } diff --git a/zhuike/src/main/java/com/novelbook/android/utils/BandanAdapter.java b/zhuike/src/main/java/com/novelbook/android/utils/BandanAdapter.java index 0f4819d..3a25e5d 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/BandanAdapter.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/BandanAdapter.java @@ -5,10 +5,12 @@ import android.support.v7.widget.RecyclerView; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; +import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; import com.novelbook.android.R; +import com.novelbook.android.bean.NovelBlock; import com.novelbook.android.db.Novel; import java.util.ArrayList; @@ -23,10 +25,10 @@ import butterknife.ButterKnife; private final int IMAGE_VIEW = 3; private Context context; - private List mDatas = new ArrayList(); + private List mDatas = new ArrayList(); private OnItemClickListener mOnItemClickLitener; private int listItemID; - public BandanAdapter(Context context, List mDatas, int listItemID, OnItemClickListener clickLitener) { + public BandanAdapter(Context context, List mDatas, int listItemID, OnItemClickListener clickLitener) { this.context = context; this.mDatas = mDatas; this.mOnItemClickLitener = clickLitener; @@ -60,7 +62,7 @@ import butterknife.ButterKnife; - public void setParameters(List mDatas,int listItemID ) { + public void setParameters(List mDatas,int listItemID ) { this.mDatas = mDatas; this.listItemID = listItemID; } @@ -73,22 +75,56 @@ import butterknife.ButterKnife; @Override public void onBindViewHolder(MyViewHolder holder, int position) { - holder.tvCateName .setText(mDatas.get(0).getNovelType()); + holder.ll1.setVisibility(View.GONE); + holder.ll2.setVisibility(View.GONE); + holder.ll3.setVisibility(View.GONE); + NovelBlock nb = mDatas.get(position); + holder.tvCateName.setText(nb.getName()); + if(nb==null){return;} + if(nb.getNs().size()>0) { - holder.tvTitle.setText(mDatas.get(0).getName()); - holder.tvAuthor.setText(mDatas.get(0).getAuthor()); - holder.tvCate.setText(mDatas.get(0).getNovelType()); - holder.tvDesc.setText(mDatas.get(0).getDesc()); + Novel novel = nb.getNs().get(0); + if(novel!=null) { + holder.ll1.setVisibility(View.VISIBLE); + + holder.tvTitle.setText(novel.getName()); + holder.tvAuthor.setText(novel.getAuthor()); + holder.tvCate.setText(novel.getNovelType()); + holder.tvDesc.setText(novel.getDesc()); + ImageUtil.loadImage(context,novel.getCover(),holder.imageView); + } + + } + if(nb.getNs().size()>1) { + + Novel novel = nb.getNs().get(1); + if(novel!=null) { + holder.ll2.setVisibility(View.VISIBLE); + + holder.tvTitle2.setText(novel.getName()); + holder.tvAuthor2.setText(novel.getAuthor()); + holder.tvCate2.setText(novel.getNovelType()); + holder.tvDesc2.setText(novel.getDesc()); + ImageUtil.loadImage(context,novel.getCover(),holder.imageView2); + } + + } + + if(nb.getNs().size()>2) { + + Novel novel = nb.getNs().get(2); + if(novel!=null) { + holder.ll3.setVisibility(View.VISIBLE); + holder.tvTitle3.setText(novel.getName()); + holder.tvAuthor3.setText(novel.getAuthor()); + holder.tvCate3.setText(novel.getNovelType()); + holder.tvDesc3.setText(novel.getDesc()); + ImageUtil.loadImage(context,novel.getCover(),holder.imageView3); + } + + } - holder.tvTitle2.setText(mDatas.get(1).getName()); - holder.tvAuthor2.setText(mDatas.get(1).getAuthor()); - holder.tvCate2.setText(mDatas.get(1).getNovelType()); - holder.tvDesc2.setText(mDatas.get(1).getDesc()); - holder.tvTitle3.setText(mDatas.get(2).getName()); - holder.tvAuthor3.setText(mDatas.get(2).getAuthor()); - holder.tvCate3.setText(mDatas.get(2).getNovelType()); - holder.tvDesc3.setText(mDatas.get(2).getDesc()); // 如果设置了回调,则设置点击事件 if (mOnItemClickLitener != null) @@ -120,7 +156,7 @@ import butterknife.ButterKnife; public void onClick(View v) { int pos = position; - mOnItemClickLitener.onLinearOutClick(holder.itemView, pos,1); + mOnItemClickLitener.onLinearOutClick(holder.itemView, pos,0); } }); @@ -129,7 +165,7 @@ import butterknife.ButterKnife; public void onClick(View v) { int pos = position; - mOnItemClickLitener.onLinearOutClick(holder.itemView, pos,2); + mOnItemClickLitener.onLinearOutClick(holder.itemView, pos,1); } }); @@ -138,7 +174,7 @@ import butterknife.ButterKnife; public void onClick(View v) { int pos = position; - mOnItemClickLitener.onLinearOutClick(holder.itemView, pos,3); + mOnItemClickLitener.onLinearOutClick(holder.itemView, pos,2); } }); @@ -193,7 +229,12 @@ import butterknife.ButterKnife; LinearLayout ll2; @BindView(R.id.ll3) LinearLayout ll3; - + @BindView(R.id.imageView) + ImageView imageView; + @BindView(R.id.imageView2) + ImageView imageView2; + @BindView(R.id.imageView3) + ImageView imageView3; public MyViewHolder(View view) { super(view); diff --git a/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java b/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java index 850e72f..8549166 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/CommonUtil.java @@ -4,13 +4,17 @@ import android.app.Activity; import android.content.Context; import android.content.pm.PackageInfo; import android.content.pm.PackageManager; +import android.text.TextUtils; import android.util.DisplayMetrics; import android.util.TypedValue; import android.view.Display; +import android.view.TextureView; import android.view.Window; import android.view.WindowManager; import java.lang.reflect.Method; +import java.text.SimpleDateFormat; +import java.util.Date; import java.util.Locale; @@ -260,6 +264,15 @@ public class CommonUtil { return versionName; } + public static String getDateString(long time,String format){ + String f = TextUtils.isEmpty(format) ?"yyyy年MM月dd日 HH:mm:ss":format; + Date dt = new Date(time); + SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss"); + return sdf.format(dt); + } + public static String getDateString(long time){ + return getDateString(time,""); + } } diff --git a/zhuike/src/main/java/com/novelbook/android/utils/Constants.java b/zhuike/src/main/java/com/novelbook/android/utils/Constants.java index 3460902..123cb88 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/Constants.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/Constants.java @@ -1,6 +1,8 @@ package com.novelbook.android.utils; public class Constants { + public static final String BLOCK_TITLE_NOVELS = "ns"; + public static final int NOVEL_SPAN_CNT =3 ; //grid columns public static int SEX=1; } diff --git a/zhuike/src/main/java/com/novelbook/android/utils/GaoSiTransForm.java b/zhuike/src/main/java/com/novelbook/android/utils/GaoSiTransForm.java new file mode 100644 index 0000000..e120b74 --- /dev/null +++ b/zhuike/src/main/java/com/novelbook/android/utils/GaoSiTransForm.java @@ -0,0 +1,117 @@ +package com.novelbook.android.utils; + +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.Canvas; +import android.graphics.Paint; +import android.os.Build; +import android.renderscript.RSRuntimeException; +import android.support.annotation.NonNull; + +import com.bumptech.glide.Glide; +import com.bumptech.glide.load.engine.bitmap_recycle.BitmapPool; +import com.bumptech.glide.load.resource.bitmap.BitmapTransformation; + +import java.nio.charset.Charset; +import java.security.MessageDigest; + +import jp.wasabeef.glide.transformations.internal.FastBlur; +import jp.wasabeef.glide.transformations.internal.RSBlur; + + +public class GaoSiTransForm extends BitmapTransformation { + private static String STRING_CHARSET_NAME = "UTF-8"; + private static final String ID = "GaoSiTransFormtion"; + private static Charset CHARSET = Charset.forName(STRING_CHARSET_NAME); + private static final byte[] ID_BYTES = ID.getBytes(CHARSET); + + private static int MAX_RADIUS = 25; + private static int DEFAULT_DOWN_SAMPLING = 1; + + private Context mContext; + private BitmapPool mBitmapPool; + + private int mRadius; + private int mSampling; + + public GaoSiTransForm(Context context) { + this(context, Glide.get(context).getBitmapPool(), MAX_RADIUS, DEFAULT_DOWN_SAMPLING); + } + + public GaoSiTransForm(Context context, BitmapPool pool) { + this(context, pool, MAX_RADIUS, DEFAULT_DOWN_SAMPLING); + } + + public GaoSiTransForm(Context context, BitmapPool pool, int radius) { + this(context, pool, radius, DEFAULT_DOWN_SAMPLING); + } + + public GaoSiTransForm(Context context, int radius) { + this(context, Glide.get(context).getBitmapPool(), radius, DEFAULT_DOWN_SAMPLING); + } + + public GaoSiTransForm(Context context, int radius, int sampling) { + this(context, Glide.get(context).getBitmapPool(), radius, sampling); + } + + public GaoSiTransForm(Context context, BitmapPool pool, int radius, int sampling) { + mContext = context.getApplicationContext(); + mBitmapPool = pool; + mRadius = radius; + mSampling = sampling; + } + + + + @Override + protected Bitmap transform(@NonNull BitmapPool pool, @NonNull Bitmap toTransform, int + outWidth, int outHeight) { + Bitmap source = toTransform; + + int width = source.getWidth(); + int height = source.getHeight(); + int scaledWidth = width / mSampling; + int scaledHeight = height / mSampling; + + Bitmap bitmap = mBitmapPool.get(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888); + if (bitmap == null) { + bitmap = Bitmap.createBitmap(scaledWidth, scaledHeight, Bitmap.Config.ARGB_8888); + } + + Canvas canvas = new Canvas(bitmap); + canvas.scale(1 / (float) mSampling, 1 / (float) mSampling); + Paint paint = new Paint(); + paint.setFlags(Paint.FILTER_BITMAP_FLAG); + canvas.drawBitmap(source, 0, 0, paint); + + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.JELLY_BEAN_MR2) { + try { + bitmap = RSBlur.blur(mContext, bitmap, mRadius); + } catch (RSRuntimeException e) { + bitmap = FastBlur.blur(bitmap, mRadius, true); + } + } else { + bitmap = FastBlur.blur(bitmap, mRadius, true); + } + + //return BitmapResource.obtain(bitmap, mBitmapPool); + return bitmap; + } + + @Override + public int hashCode() { + return ID.hashCode(); + } + + @Override + public boolean equals(Object obj) { + return obj instanceof GaoSiTransForm; + } + + @Override + public void updateDiskCacheKey(MessageDigest messageDigest) { + messageDigest.update(ID_BYTES); + } + +} diff --git a/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java b/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java index 5393e4c..5fd8f71 100644 --- a/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java +++ b/zhuike/src/main/java/com/novelbook/android/utils/GsonUtil.java @@ -1,12 +1,23 @@ package com.novelbook.android.utils; +import com.google.gson.Gson; +import com.google.gson.JsonArray; +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import com.google.gson.JsonParser; +import com.novelbook.android.bean.NovelBlock; import com.novelbook.android.db.Novel; import org.json.JSONException; import org.json.JSONObject; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; + public class GsonUtil { + private static Gson gson = new Gson(); public static Novel getNovel(String json){ Novel nv = new Novel(); try { @@ -27,4 +38,72 @@ public class GsonUtil { } return nv; } + public static List parserNovleBlocks(String restult,String blockName ) throws JSONException { + JSONObject jsonObject = new JSONObject(restult); + String strJson = jsonObject.getString(blockName); + List list = new ArrayList(); + //创建一个Gson对象 + // Gson gson = new Gson(); + //创建一个JsonParser + JsonParser parser = new JsonParser(); + //通过JsonParser对象可以把json格式的字符串解析成一个JsonElement对象 + JsonElement el = parser.parse(strJson); + + //把JsonElement对象转换成JsonObject + JsonObject jsonObj = null; + if (el.isJsonObject()) { + jsonObj = el.getAsJsonObject(); + } + + + //把JsonElement对象转换成JsonArray + JsonArray jsonArray = null; + if (el.isJsonArray()) { + jsonArray = el.getAsJsonArray(); + } + + //遍历JsonArray对象 + Iterator it = jsonArray.iterator(); + while (it.hasNext()) { + JsonElement e = (JsonElement) it.next(); + //JsonElement转换为JavaBean对象 + list.add((NovelBlock) gson.fromJson(e, NovelBlock.class)); + } + return list; + } + public static List parserJsonArray(String restult,String blockName ) throws JSONException { + + JSONObject jsonObject = new JSONObject(restult); + String resultstr = jsonObject.getString(blockName); + + List list = new ArrayList(); + //创建一个Gson对象 + // Gson gson = new Gson(); + //创建一个JsonParser + JsonParser parser = new JsonParser(); + //通过JsonParser对象可以把json格式的字符串解析成一个JsonElement对象 + JsonElement el = parser.parse(resultstr); + + //把JsonElement对象转换成JsonObject + JsonObject jsonObj = null; + if (el.isJsonObject()) { + jsonObj = el.getAsJsonObject(); + } + + + //把JsonElement对象转换成JsonArray + JsonArray jsonArray = null; + if (el.isJsonArray()) { + jsonArray = el.getAsJsonArray(); + } + + //遍历JsonArray对象 + Iterator it = jsonArray.iterator(); + while (it.hasNext()) { + JsonElement e = (JsonElement) it.next(); + //JsonElement转换为JavaBean对象 + list.add((Novel) gson.fromJson(e, Novel.class)); + } + return list; + } } diff --git a/zhuike/src/main/res/layout/activity_book.xml b/zhuike/src/main/res/layout/activity_book.xml index 8050579..a6f2f83 100644 --- a/zhuike/src/main/res/layout/activity_book.xml +++ b/zhuike/src/main/res/layout/activity_book.xml @@ -33,23 +33,25 @@ android:fitsSystemWindows="true" app:contentScrim="?attr/colorPrimary" app:layout_scrollFlags="scroll|exitUntilCollapsed" + app:collapsedTitleGravity="center" + app:expandedTitleGravity="bottom" + app:expandedTitleTextAppearance="@style/TitleText" app:toolbarId="@+id/toolbar"> @@ -58,20 +60,20 @@ android:layout_height="wrap_content" android:gravity="bottom" android:layout_gravity="center" - android:layout_marginLeft="25dp" + android:layout_marginLeft="30dp" android:layout_marginRight="20dp" android:orientation="horizontal"> + android:layout_height="100dp" + android:layout_width="80dp" + /> - - - + style="@style/TextViewNovelType" + android:text="aaa" + /> + + + @@ -126,8 +126,13 @@