项目截图:

仿知乎日报APP开发项目_仿知乎日报APP开发项目




用到的开源库有:

android-support-v7-appcompat

android-support-v7cardview

lib_ParallaxScroll

lib_SHSwitchView

lib_yuchen0612

library

library_PagerSlidingTabStrip


FirstActivity欢迎界面类

public class FirstActivity extends Activity

{

    

    private long delayMillis=1000;


    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_first);

 new Handler().postDelayed(new Runnable()

{

   

   @Override

   public void run()

   {

startActivity(new Intent(FirstActivity.this,MainActivity.class));

FirstActivity.this.finish();

   }

}, delayMillis);

    }

    

 

   

}



MainActivity类:

public class MainActivity extends AppCompatActivity implements OnClickListener

{

private DrawerLayout drawer;

private ListView drawerList;

private Toolbar toolbar;

private Fragment fragment;

private DrawerListAdapter mDrawerAdapter;

private List<Other> alTheme = new ArrayList<Other>();

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

if (SPUtils.isNight(this))

{

setTheme(R.style.night);

} else

{

setTheme(R.style.light);

}

setContentView(R.layout.activity_main);

initData();

initToolbar();

initDrawerLayout();

initDrawerMenu();

initFragment();

}

private void initData()

{

ApiClient.getTheme(this, new ResponseListener()

{

@Override

public void onResponse(String arg0)

{

Themes themes = GsonUtils.parseJSON(arg0, Themes.class);

List<Other> others = themes.getOthers();

alTheme.addAll(others);

mDrawerAdapter.notifyDataSetChanged();

}

@Override

public void onErrorResponse(VolleyError arg0)

{

Log.e("网络下载失败", "arg0=null" + arg0.getMessage());

}

});

}

private void initFragment()

{

replacefragment(new MainFragment());

}

private void initDrawerMenu()

{

drawerList = (ListView) findViewById(R.id.main_listView1);

// 设置选中状态为单选模式

drawerList.setChoiceMode(ListView.CHOICE_MODE_SINGLE);

View view = getLayoutInflater().inflate(R.layout.layout_relativet_headview, null);

headFindViewControl(view);

drawerList.addHeaderView(view, null, false);

mDrawerAdapter = new DrawerListAdapter();

drawerList.setAdapter(mDrawerAdapter);

drawerList.setOnItemClickListener(new OnItemClickListener()

{

@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id)

{

position -= drawerList.getHeaderViewsCount();

Other other = alTheme.get(position);

fragment = new ThemesContentFragment(other);

toolbar.setTitle(other.getName());

drawer.closeDrawer(drawerList);

replacefragment(fragment);

}

});

}

public void headFindViewControl(View view)

{

LinearLayout login = (LinearLayout) view.findViewById(R.id.head_login);// 登录

LinearLayout sc = (LinearLayout) view.findViewById(R.id.head_sc);// 收藏

LinearLayout wc = (LinearLayout) view.findViewById(R.id.head_wc);// 完成

LinearLayout sy = (LinearLayout) view.findViewById(R.id.head_sy);// 首页

ImageView img = (ImageView) view.findViewById(R.id.head_login_img);// 登录图标

login.setOnClickListener(this);

sy.setOnClickListener(this);

sc.setOnClickListener(this);

wc.setOnClickListener(this);

}

public void replacefragment(Fragment fragment)

{

FragmentManager smf = getSupportFragmentManager();

FragmentTransaction bt = smf.beginTransaction();

bt.replace(R.id.main_container, fragment);

bt.commit();

}

@SuppressWarnings("deprecation")

private void initDrawerLayout()

{

drawer = (DrawerLayout) findViewById(R.id.main_drawer);

}

private void initToolbar()

{

toolbar = (Toolbar) findViewById(R.id.main_toolbar);

setSupportActionBar(toolbar);

ActionBar supportActionBar = getSupportActionBar();

// 设置显示返回按钮图标

supportActionBar.setDisplayHomeAsUpEnabled(true);

// 设置标题

supportActionBar.setTitle("知乎日报");

// 设置标题图标

supportActionBar.setLogo(R.drawable.toolbar_icon1);

// 设置显示标题图标

supportActionBar.setDisplayShowHomeEnabled(true);

supportActionBar.setDisplayUseLogoEnabled(true);

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

getMenuInflater().inflate(R.menu.main, menu);

MenuItem item = menu.findItem(R.id.item2);

if (SPUtils.isNight(this))

{

item.setTitle("白天模式");

} else

{

item.setTitle("夜间模式");

}

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item)

{

switch (item.getItemId())

{

case android.R.id.home:

drawer.openDrawer(drawerList);

break;

case R.id.item2:// 夜间模式和白天模式互相切换

boolean isNight = SPUtils.isNight(this);

SPUtils.setMode(this, !isNight);

finish();

startActivity(new Intent(this, MainActivity.class));

overridePendingTransition(0, 0);

break;

case R.id.item3:// 打开设置选项

startActivity(new Intent(this, SettingActivity.class));

finish();

break;

default:

break;

}

return true;

}

class DrawerListAdapter extends BaseAdapter

{

@Override

public int getCount()

{

return alTheme.size();

}

@Override

public Object getItem(int position)

{

return null;

}

@Override

public long getItemId(int position)

{

return 0;

}

@SuppressLint("ViewHolder")

@Override

public View getView(int position, View convertView, ViewGroup parent)

{

View layout = getLayoutInflater().inflate(R.layout.mdrawerlist_linear, null);

TextView tv = (TextView) layout.findViewById(R.id.tv_mdrawerlist);

String text = alTheme.get(position).getName();

tv.setText(text);

return layout;

}

}

@Override

public void onClick(View v)

{

switch (v.getId())

{

case R.id.head_login:

fragment = new LoginFragment();

toolbar.setTitle("登录界面");

break;

case R.id.head_sc:

fragment = new CollectFragment();

toolbar.setTitle("我的收藏");

break;

case R.id.head_wc:

   Toast.makeText(this, "离线下载完成", Toast.LENGTH_SHORT).show();

break;

case R.id.head_sy:

fragment = new MainFragment();

toolbar.setTitle("首页");

break;

default:

break;

}

drawer.closeDrawer(drawerList);

replacefragment(fragment);

}

}



DetailActivity详情类

public class DetailActivity extends AppCompatActivity implements OnClickListener

{

private ImageView img;

private TextView tvComment;

private TextView tvPraise;

private Story story;

private ImageView collectImage;

private WebView mweb;

private String url;

@Override

protected void onCreate(Bundle savedInstanceState)

{

super.onCreate(savedInstanceState);

if (SPUtils.isNight(this))

{

setTheme(R.style.night);

} else

{

setTheme(R.style.light);

}

setContentView(R.layout.activity_detail);

// 设置ToolBar

Toolbar mToolbar = (Toolbar) findViewById(R.id.detail_toolbar);

setSupportActionBar(mToolbar);

ActionBar mActionBar = getSupportActionBar();

mActionBar.setTitle("");

// 设置显示返回键

mActionBar.setDisplayHomeAsUpEnabled(true);

initWeb();

initData();

}

private void initData()

{

Intent intent = getIntent();

story = (Story) intent.getSerializableExtra("story");

boolean hasCollect = DBUtil.hasCollect(story);

if (hasCollect)

{

collectImage.setImageResource(R.drawable.collected); // 设已收藏图片

} else

{

collectImage.setImageResource(R.drawable.collect); // 设置未收藏图片

}

ApiClient.getDetail(this, story.getStoryId(), new ResponseListener()

{

@Override

public void onResponse(String arg0)

{

Detail detail = GsonUtils.parseJSON(arg0, Detail.class);

url=detail.getShareUrl();

// 对控件设置图片

UILUtils.displayImageNoAnim(detail.getImage(), img);

String body = detail.getBody();

List<String> css = detail.getCss();

if (css.size() > 0)

{

String cssLink = "<link rel=\"stylesheet\" type=\"text/css\" href=\"%s\"> ";

String formatCss = String.format(cssLink, ZHConstants.url.css);

body = formatCss + body;

}

mweb.loadDataWithBaseURL(null, body, "text/html", "utf-8", null);

}

@Override

public void onErrorResponse(VolleyError arg0)

{

Log.e("DetailActivity", arg0 == null ? "error" : arg0.getMessage() + "");

}

});

}

@SuppressWarnings("deprecation")

@SuppressLint("SetJavaScriptEnabled")

private void initWeb()

{

mweb = (WebView) findViewById(R.id.detail_web);

WebSettings settings = mweb.getSettings();

settings.setJavaScriptEnabled(true);

if (SendData.get())

{

settings.setTextSize(TextSize.LARGER);

} else

{

settings.setTextSize(TextSize.NORMAL);

}

mweb.setWebViewClient(new WebViewClient());

img = (ImageView) findViewById(R.id.detail_img);

collectImage = (ImageView) findViewById(R.id.action_collect);// 收藏

collectImage.setOnClickListener(this);// 设置收藏监听事件

findViewById(R.id.action_share).setOnClickListener(this);// 分享

findViewById(R.id.action_item_comment).setOnClickListener(this);// 点评布局

tvComment = (TextView) findViewById(R.id.action_item_comment_text); // 点评数

findViewById(R.id.toolbar_linear_praise).setOnClickListener(this);// 点赞布局

tvPraise = (TextView) findViewById(R.id.action_item_praise_text); // 点赞数

}

@Override

public void onClick(View v)

{

switch (v.getId())

{

   case R.id.action_share:

final Intent shareIntent = new Intent(Intent.ACTION_SEND);

shareIntent.setType("text/plain");

shareIntent.putExtra(Intent.EXTRA_TEXT, "知乎日报"+url);

startActivity(shareIntent); 

break;

case R.id.action_collect:

collect();

break;

case R.id.action_item_comment:

break;

case R.id.toolbar_linear_praise:

break;

default:

break;

}

}

private void collect()

{

boolean hasCollect = DBUtil.hasCollect(story);

if (hasCollect)

{

collectImage.setImageResource(R.drawable.collect);

DBUtil.cancleCollect(story);

} else

{

collectImage.setImageResource(R.drawable.collected);

DBUtil.collect(story);

}

}

@Override

public boolean onCreateOptionsMenu(Menu menu)

{

getMenuInflater().inflate(R.menu.detail, menu);

return true;

}

@Override

public boolean onOptionsItemSelected(MenuItem item)

{

if (item.getItemId() == android.R.id.home)

{

overridePendingTransition(0, 0);

startActivity(new Intent(this, MainActivity.class));

finish();

}

return true;

}

}




CommentActivity 评论类

public class CommentActivity extends AppCompatActivity implements OnItemClickListener {

private List<Comment> mCommentsLong = new ArrayList<>();

private List<Comment> mCommentsShort = new ArrayList<>();

public boolean showShort;


private final class CommentAdapter extends BaseAdapter {

@Override

public int getViewTypeCount() {

return 2;

}


@Override

public int getItemViewType(int position) {

if (position == 0 || position == mCommentsLong.size() + 1) {

return 0;

} else {

return 1;

}

}


@SuppressLint("InflateParams")

@Override

public View getView(int position, View convertView, ViewGroup parent) {

View layout;

if (convertView == null) {

LayoutInflater inflater = getLayoutInflater();

if (position == 0 || position == mCommentsLong.size() + 1) {

layout = inflater.inflate(R.layout.activity_comment_list_header, null);

} else {

layout = inflater.inflate(R.layout.activity_comment_list_item, null);

}

} else {

layout = convertView;

}


// 更新数据

if (position == 0) {

TextView tvHeader = (TextView) layout.findViewById(R.id.comment_list_header_text);

tvHeader.setText(mCommentsLong.size() + "条长评");

ImageView imgIcon = (ImageView) layout.findViewById(R.id.comment_list_header_icon);

imgIcon.setVisibility(View.GONE);

} else if (position == mCommentsLong.size() + 1) {

layout.setOnClickListener(new OnClickListener() {

@Override

public void onClick(View v) {

showShort = !showShort;

getCommentsShort();

}

});

TextView tvHeader = (TextView) layout.findViewById(R.id.comment_list_header_text);

ImageView imgIcon = (ImageView) layout.findViewById(R.id.comment_list_header_icon);

imgIcon.setVisibility(View.VISIBLE);

tvHeader.setText("条短评");

} else {

Comment comment;

if (position <= mCommentsLong.size() + 1){

comment = mCommentsLong.get(position - 1);

}else{

comment = mCommentsShort.get(position - 2 - mCommentsLong.size());

}

ImageView imgAvatar = (ImageView) layout.findViewById(R.id.comment_item_avatar);

ImageUtils.displayImage(CommentActivity.this, comment.getAvatar(), imgAvatar);

TextView tvAuthor = (TextView) layout.findViewById(R.id.comment_item_author);

tvAuthor.setText(comment.getAuthor());

TextView tvContent = (TextView) layout.findViewById(R.id.comment_item_content);

tvContent.setText(comment.getContent());

TextView tvTime = (TextView) layout.findViewById(R.id.comment_item_time);

// 美化时间格式

String prettyTime = PrettyTimeUtils.getPrettyTime(comment.getTime() * 1000L);

tvTime.setText(prettyTime);

ReplyTo replyTo = comment.getReplyTo();

TextView tvReply = (TextView) layout.findViewById(R.id.comment_replied_content);

if (replyTo == null){

tvReply.setVisibility(View.GONE);

}else{

tvReply.setVisibility(View.VISIBLE);

tvReply.setText(replyTo.toString());

}

}


return layout;

}


@Override

public long getItemId(int position) {

// TODO Auto-generated method stub

return 0;

}


@Override

public Object getItem(int position) {

// TODO Auto-generated method stub

return null;

}


@Override

public int getCount() {

if (showShort){

return mCommentsLong.size() + 2 + mCommentsShort.size();

}else{

return mCommentsLong.size() + 2;

}

}

}


private ActionBar mActionBar;

private ListView mListView;

private Story mStory;

private CommentAdapter mAdapter;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_comment);

initToolbar();

initUI();

initData();

}


private void initToolbar() {

Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);

setSupportActionBar(toolbar);

mActionBar = getSupportActionBar();

mActionBar.setDisplayHomeAsUpEnabled(true);

mActionBar.setTitle("30条点评");

}


private void initData() {

Intent intent = getIntent();

mStory = (Story) intent.getSerializableExtra("story");


ApiClient.getCommentsLong(this, mStory.getStoryId(), new ResponseListener() {

@Override

public void onResponse(String arg0) {

CommentsShort commentsShort = GsonUtils.parseJSON(arg0, CommentsShort.class);

List<Comment> comments = commentsShort.getComments();

mCommentsLong.addAll(comments);

mAdapter.notifyDataSetChanged();

}


@Override

public void onErrorResponse(VolleyError arg0) {

}

});

}

private void getCommentsShort() {

if (mCommentsShort.size() == 0){

ApiClient.getCommentsShort(this, mStory.getStoryId(), new ResponseListener() {

@Override

public void onResponse(String arg0) {

CommentsShort commentsShort = GsonUtils.parseJSON(arg0, CommentsShort.class);

List<Comment> comments = commentsShort.getComments();

mCommentsShort.addAll(comments);

mAdapter.notifyDataSetChanged();

if (showShort){

mListView.setSelection(mCommentsLong.size() + 1);

}else{

mListView.setSelection(0);

}

}

@Override

public void onErrorResponse(VolleyError arg0) {

}

});

}else{

mAdapter.notifyDataSetChanged();


if (showShort){

mListView.setSelection(mCommentsLong.size() + 1);

}else{

mListView.setSelection(0);

}

}

}


private void initUI() {

mListView = (ListView) findViewById(R.id.comment_listview);

mAdapter = new CommentAdapter();

mListView.setAdapter(mAdapter);

mListView.setOnItemClickListener(this);

}


@Override

public boolean onOptionsItemSelected(MenuItem item) {

int itemId = item.getItemId();

if (itemId == android.R.id.home) {

finish();

}

return super.onOptionsItemSelected(item);

}


@Override

public void onItemClick(AdapterView<?> parent, View view, int position, long id) {

Toast.makeText(this, "toast", Toast.LENGTH_SHORT).show();

}

}



SettingActivity设置类:

public class SettingActivity extends FragmentActivity implements OnClickListener

{

    

    private LinearLayout linear;

    private ShSwitchView checkDZH;

    private ShSwitchView checkNP;

    private int newVersionCode = 2;

    private String urlApk = "http://192.168.56.1:8080/visen.apk";

    private UpdatePackage update;

    

    @Override

    protected void onCreate(Bundle savedInstanceState)

    {

super.onCreate(savedInstanceState);

if (SPUtils.isNight(this))

{

   setTheme(R.style.night);

} else

{

   setTheme(R.style.light);

}

setContentView(R.layout.activity_setting);

linear = (LinearLayout) findViewById(R.id.setting_linear);

RelativeLayout relativeNopic= ( RelativeLayout) findViewById(R.id.setting_relativeNopic);

RelativeLayout relativeDzh = ( RelativeLayout) findViewById(R.id.setting_relativeDzh);

 relativeNopic.setOnClickListener(this); 

 relativeDzh.setOnClickListener(this); 

findViewById(R.id.setting_back_icon).setOnClickListener(this);// 返回键

findViewById(R.id.setting_clear).setOnClickListener(this);// 清除缓存

findViewById(R.id.setting_updatetv).setOnClickListener(this);// 检查更新

checkDZH = (ShSwitchView) findViewById(R.id.setting_dzh);// 设置大字号

checkNP = (ShSwitchView) findViewById(R.id.setting_nopic); // 设置无图模式

checkDZH.setOn(SendData.get());

checkNP.setOn(SPUtils.isNoPic(SettingActivity.this));

checkDZH.setOnSwitchStateChangeListener(new OnSwitchStateChangeListener()

{

   

   @Override

   public void onSwitchStateChange(boolean isOn)

   {

SendData.set(SendData.get());

   }

});

checkNP.setOnSwitchStateChangeListener(new OnSwitchStateChangeListener()

{

   

   @Override

   public void onSwitchStateChange(boolean isOn)

   {

SPUtils.setNoPic(SettingActivity.this, SPUtils.isNoPic(SettingActivity.this));

   }

});


    }

    

    @Override

    protected void onResume()

    {

super.onResume();

// 保存点击时的状态

if (SPUtils.isNight(this))

{

   linear.setBackgroundResource(R.color.night_toolbar);

} else

{

   linear.setBackgroundResource(R.color.light_toolbar);

}

    }

    

    @SuppressWarnings("deprecation")

    @Override

    public void onClick(View v)

    {

switch (v.getId())

{

   case R.id.setting_back_icon:

overridePendingTransition(0, 0);

startActivity(new Intent(this, MainActivity.class));

finish();

break;

   case R.id.setting_relativeDzh:

checkDZH.setOn(!SendData.get());

SendData.set(!SendData.get());

break;

   case R.id.setting_clear:// 清空缓存

ImageLoader.getInstance().clearDiscCache();

Toast.makeText(this, "清空成功", Toast.LENGTH_SHORT).show();

break;

   case R.id.setting_relativeNopic:// 设置无图模式

boolean isNoPic = SPUtils.isNoPic(this);

checkNP.setOn(!isNoPic);

SPUtils.setNoPic(this, !isNoPic);

break;

   case R.id.setting_updatetv:// 检查更新

setMyDialog( );

break;

   default:

break;

}

    }

    

    

    

    

    public  void setMyDialog( )

    {

update = new UpdatePackage(this); 

if (newVersionCode >update.getVersionNum())

{

   String content = "1.解决了某bug\n2.增加了某功能";

   MyDialog myDialog = new MyDialog(content);

   myDialog.show(getSupportFragmentManager(), null); 

   

   // 点击确定时下载apk文件

   myDialog.setOnConfirmListener(new OnConfirmListener()

   {

@Override

public void confirm()

{

   update.download(urlApk); 

}


   });

}

    }

    

   

    

   

    

    

    

}