たまに、QQグループで、生徒がこのプラットフォームについて尋ねているのを見たところ、ログインしてそれを見ました。たまたま、自己学習型Androidのボトルネックになりました。私はこのプラットフォームをベースにしたニュースアプリを作成しました。プラットフォームは無料で、説明は非常に詳細です。初めて開くのが遅い場合や、何度か試してみる場合もあります。これはプラットフォームのアドレスです。
http://www.tngou.net/
以下はインターフェースです:http :
//www.tngou.net/blog/show/1296
無料のプラットフォームを提供する先輩へのオマージュ!
:私はすでに特徴があり実現している
(それは長い時間だが、十分に学ぶために、原稿を読み取ることができます更新されませんでした、最近のニュースの一覧。)最新ニュース一覧を読んで
ニュースコンテンツを読むには
、コメントの関連読み取るために
アカウント登録を、アカウントのログイン、個人情報の設定(ここでは遅延、個人情報の設定をクリックした直後にWebサイトにジャンプします...)
このプロジェクトは、サーバーとのデータのやり取りやデータ分析を含む初心者の演習に適しています。不利な点は、インターフェースがいらいらし、フレームワークがまったくないため、コードが多く書かれるほど結合の度合いが高くなり、ロジックがより混乱することです。
画像は2Mのみなので、一部のみが記録されました。
プロジェクトの構造:
アカウントは主にアカウントのログイン、登録、および個人情報の変更用です。
アダプターには2つのアダプターが含まれ、1つはコメントリスト用のアダプター、もう1つはニュースリスト
用のアダプターです
。GetContextはImageCache などのContextオブジェクトを取得するために使用されます。画像キャッシュ、画像の使用が計画されていますローカルにキャッシュします。アプリを開くたびにサーバーにアクセスして画像をダウンロードする必要はありません。関数は
JSON JSONデータ分析を追加していません
CommentsActivityコメントリスト関連のロジック操作
ItemActivityニュースコンテンツインターフェイス関連のロジック操作
MainActivityテーマフレームロジックイベントとニュースリストロジックイベント、ほとんどのUI更新
RecyclerItemニュースカテゴリには、ニュースに関する基本的な情報が含まれています
各クラスには詳細なコメントがありますが、言うまでもありません。MainActivityは以下に掲載されています。
/**
* 主页 app第一页
*/
public class MainActivity extends AppCompatActivity {
private String PATH = "http://www.tngou.net/api/top/list";//热点词api,通过获取热点词汇的id获取热词详情
private RecyclerView recyclerView; //新闻列表
private DrawerLayout drawerLayout; //抽屉视图
private NavigationView navigationView; //导航视图
private SwipeRefreshLayout swipeRefreshLayout; //下拉刷新
private FloatingActionButton actionButton; //悬浮按钮
private RecyclerAdapter adapter; //新闻列表适配器
private CircleImageView circleImageView;//头像
private TextView individuality_text;//个性签名
private List<RecyclerItem> list_items = new ArrayList<>(); //新闻列表子项
private User user; //用户信息获取类
private String domain = null; //用户主页域名
// private String access_token = null;//访问令牌
private static int[] image_ID = {R.drawable.aa, R.drawable.bb, R.drawable.cc, R.drawable.dd, R.drawable.ee, R.drawable.ff, R.drawable.gg, R.drawable.hh, R.drawable.ii,
R.drawable.jj, R.drawable.kk, R.drawable.ll, R.drawable.mm, R.drawable.nn, R.drawable.bb, R.drawable.cc, R.drawable.dd, R.drawable.ee, R.drawable.ff, R.drawable.gg};
public static int get_Image_ID() { //为没有图片的新闻随机一个图片
Random random = new Random();
return image_ID[random.nextInt(image_ID.length)];
}
private Handler handler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg); //网络数据获取后通过message发送给UI线程
switch (msg.what) {
case 1: //新闻列表
JSON json = new JSON();
json.withJSONObject(msg.getData().getString("JSON_data")); //JSON数据解析
List<String> list_img = json.getImg_list(); // 新闻图片地址
List<String> list_title = json.getList_title(); //新闻标题
List<String> list_description = json.getList_description(); //新闻摘要
List<Long> list_ID = json.getList_ID(); //新闻详情地址
for (int i = 0; i < list_img.size(); i++) {
list_items.add(new RecyclerItem(list_title.get(i), list_img.get(i), list_description.get(i), list_ID.get(i)));
}
adapter.notifyDataSetChanged(); //通知适配器数据更新
break;
case 2: //显示个人信息
individuality_text.setText(user.getSignature());
Glide.with(MainActivity.this).load("http://tnfs.tngou.net/img" + user.getAvatar()).into(circleImageView);
domain = user.getDomain();
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
setSupportActionBar(toolbar); //设置自定义tab
ActionBar actionBar = getSupportActionBar();
if (actionBar != null) {
actionBar.setDisplayHomeAsUpEnabled(true);//显示HomeAsUp键
actionBar.setHomeAsUpIndicator(R.drawable.ic_menu); //设置HomeAsUp键图标
}
drawerLayout = (DrawerLayout) findViewById(R.id.activity_main);
navigationView = (NavigationView) findViewById(R.id.navigation_view);
navigationView.setCheckedItem(R.id.nav_call); //设置导航视图默认选中项
//导航视图子项事件监听
navigationView.setNavigationItemSelectedListener(new NavigationView.OnNavigationItemSelectedListener() {
@Override
public boolean onNavigationItemSelected(@NonNull MenuItem item) {
switch (item.getItemId()) {
case R.id.nav_task://切换到账号注册
AccountOperation accountOperation = new AccountOperation(MainActivity.this, new UserLoginCallback() {
@Override
public void LoginSuccessful(String access_token, String refresh_token) { // 注册成功,反馈回access_token访问令牌 refresh_token 刷新令牌
user = new User(access_token, null, handler); // 子线程从服务器获取到用户个人信息,发送一个msg
// MainActivity.this.access_token = access_token;
}
@Override
public void loginFailed(String msg) { //注册失败服务端反馈的消息
}
});
break;
case R.id.nav_mail://切换到账号登录
AccountLogin accountLogin = new AccountLogin(MainActivity.this, new UserLoginCallback() {
@Override
public void LoginSuccessful(String access_token, String refresh_token) {//登录成功,反馈回来access_token访问令牌 refresh_token 刷新令牌
user = new User(access_token, null, handler); // 子线程从服务器获取到用户个人信息,发送一个msg
// MainActivity.this.access_token = access_token;
}
@Override
public void loginFailed(String msg) {//登录失败服务端反馈的消息
}
});
break;
}
return true;
}
});
// headerLayout = navigationView.inflateHeaderView(R.layout.nav_header_main);//加载头部view
View headerView = navigationView.getHeaderView(0);//获得头部View
circleImageView = (CircleImageView) headerView.findViewById(R.id.head_portrait);
circleImageView.setOnClickListener(new View.OnClickListener() { //点击用户头像 进入个人资料页面
@Override
public void onClick(View view) {//头像点击事件监听
if (domain == null) {//如果domain为空 则先登录
AccountLogin accountLogin = new AccountLogin(MainActivity.this, new UserLoginCallback() {
@Override
public void LoginSuccessful(String access_token, String refresh_token) {//登录成功,反馈回来access_token访问令牌 refresh_token 刷新令牌
user = new User(access_token, null, handler); // 子线程从服务器获取到用户个人信息,发送一个msg
// MainActivity.this.access_token = access_token;
}
@Override
public void loginFailed(String msg) {//登录失败服务端反馈的消息
}
});
} else {
Intent intent = new Intent(MainActivity.this, UserInformation.class);
intent.putExtra("path", "http://www.tngou.net/my/"+domain);
MainActivity.this.startActivity(intent);
}
}
});
individuality_text = (TextView) headerView.findViewById(R.id.individuality_signature);
circleImageView.setImageResource(R.drawable.bb);//默认头像
individuality_text.setText("我在等待,一个有你的未来!");//默认签名
actionButton = (FloatingActionButton) findViewById(R.id.FAButton);//悬浮按钮设置及事件监听
actionButton.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Snackbar.make(view, "悬浮按钮,功能待添加", Snackbar.LENGTH_LONG).setAction("确定", new View.OnClickListener() {
@Override
public void onClick(View view) {
Toast.makeText(MainActivity.this, "点击悬浮按钮", Toast.LENGTH_SHORT).show();
}
}).show();
}
});
data_init(); //新闻数据初始化(包括加载网络数据)
recyclerView = (RecyclerView) findViewById(R.id.recycler_view);
adapter = new RecyclerAdapter(list_items);
LinearLayoutManager linearLayoutManager = new LinearLayoutManager(this);
recyclerView.setLayoutManager(linearLayoutManager);
recyclerView.setAdapter(adapter);//recyclerView相关设置
swipeRefreshLayout = (SwipeRefreshLayout) findViewById(R.id.swipe);
swipeRefreshLayout.setColorSchemeResources(R.color.colorPrimary);
swipeRefreshLayout.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
@Override
public void onRefresh() {
data_init();//下拉刷新数据
swipeRefreshLayout.setRefreshing(false);
}
});
}
public void data_init() {
HttpUtil.sendHttpRequest(PATH, new HttpCallbackListener() {//加载网络数据并将数据通过msg发送到UI线程
@Override
public void onFinish(final String response) {
Bundle bundle = new Bundle();
bundle.putString("JSON_data", response);
// Message msg = new Message();
Message msg = Message.obtain();
msg.setData(bundle);
msg.what = 1;
handler.sendMessage(msg);
}
@Override
public void onError(Exception e) {
Toast.makeText(MainActivity.this, "数据请求失败", Toast.LENGTH_SHORT).show();
}
});
}
@Override
public boolean onCreateOptionsMenu(Menu menu) {
getMenuInflater().inflate(R.menu.toolbar, menu);
return true;
}
@Override
public boolean onOptionsItemSelected(MenuItem item) { //菜单选项点击监听
switch (item.getItemId()) {
case R.id.ic_backup:
Toast.makeText(this, "" + item.getTitle(), Toast.LENGTH_SHORT).show();
break;
case R.id.ic_comment:
Toast.makeText(this, "" + item.getTitle(), Toast.LENGTH_SHORT).show();
break;
case android.R.id.home:
drawerLayout.openDrawer(GravityCompat.START);
break;
}
return true;
}
}
プロジェクト全体がgithubにアップロードされました:https : //github.com/Guojiankai/news
修正の交換へようこそ!