![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第1頁(yè)](http://file4.renrendoc.com/view/bdb33738d31b3b01b2f497fad92bd814/bdb33738d31b3b01b2f497fad92bd8141.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第2頁(yè)](http://file4.renrendoc.com/view/bdb33738d31b3b01b2f497fad92bd814/bdb33738d31b3b01b2f497fad92bd8142.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第3頁(yè)](http://file4.renrendoc.com/view/bdb33738d31b3b01b2f497fad92bd814/bdb33738d31b3b01b2f497fad92bd8143.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第4頁(yè)](http://file4.renrendoc.com/view/bdb33738d31b3b01b2f497fad92bd814/bdb33738d31b3b01b2f497fad92bd8144.gif)
![【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第5頁(yè)](http://file4.renrendoc.com/view/bdb33738d31b3b01b2f497fad92bd814/bdb33738d31b3b01b2f497fad92bd8145.gif)
版權(quán)說(shuō)明:本文檔由用戶(hù)提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化
這篇文章將為大家詳細(xì)講解有關(guān)怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化,文章內(nèi)容質(zhì)量較高,因此在下分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。1、界面布局<?xml
version="1.0"
encoding="utf-8"?>
<LinearLayout
xmlns:android="/apk/res/android"
android:orientation="horizontal"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:gravity="center">
<ImageView
android:id="@+id/image"
android:src="@mipmap/ic_launcher"
android:layout_width="60dp"
android:layout_height="60dp"
/>
<LinearLayout
android:orientation="vertical"
android:layout_marginLeft="10dp"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:id="@+id/title_tv"
android:text="TITLE"
android:textSize="15dp"
android:maxLines="1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
<TextView
android:id="@+id/content_tv"
android:text="CONTENT"
android:textSize="10dp"
android:maxLines="3"
android:layout_width="match_parent"
android:layout_height="wrap_content"
/>
</LinearLayout>
</LinearLayout><?xml
version="1.0"
encoding="utf-8"?>
<RelativeLayout
xmlns:android="/apk/res/android"
xmlns:tools="/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.leixiansheng.news.MainActivity">
<ListView
android:id="@+id/list_view"
android:layout_width="match_parent"
android:layout_height="match_parent">
</ListView>
</RelativeLayout>2、開(kāi)啟異步解析數(shù)據(jù)package
com.example.leixiansheng.news;
/**
*
Created
by
Leixiansheng
on
2017/3/21.
*/
public
class
NewsBean
{
public
String
viewUrl;
public
String
title;
public
String
content;
}
package
com.example.leixiansheng.news;
import
android.os.AsyncTask;
import
android.support.v7.app.AppCompatActivity;
import
android.os.Bundle;
import
android.util.Log;
import
android.widget.ListView;
import
org.json.JSONArray;
import
org.json.JSONException;
import
org.json.JSONObject;
import
java.io.BufferedReader;
import
java.io.IOException;
import
java.io.InputStream;
import
java.io.InputStreamReader;
import
java.io.UnsupportedEncodingException;
import
.URL;
import
java.util.ArrayList;
import
java.util.List;
public
class
MainActivity
extends
AppCompatActivity
{
private
ListView
listView;
private
static
String
URL
=
"/api/teacher?type=4&num=30";
@Override
protected
void
onCreate(Bundle
savedInstanceState)
{
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
listView
=
(ListView)
findViewById(R.id.list_view);
new
NewsAsyncTask().execute(URL);
}
//*&*異步加載,處理耗時(shí)任務(wù),UI更新
class
NewsAsyncTask
extends
AsyncTask<String,
Void,
List<NewsBean>>
{
@Override
protected
List<NewsBean>
doInBackground(String...
strings)
{
return
getJsonData(strings[0]);
}
@Override
protected
void
onPostExecute(List<NewsBean>
newsBeen)
{
super.onPostExecute(newsBeen);
NewsAdapter
adapter
=
new
NewsAdapter(MainActivity.this,
newsBeen,listView);
listView.setAdapter(adapter);
}
}
//*&*JSON解析網(wǎng)頁(yè)獲取數(shù)據(jù)
private
List<NewsBean>
getJsonData(String
url)
{
List<NewsBean>
newsBeanList
=
new
ArrayList<>();
try
{
String
jsonString
=
readSteam(new
URL(url).openStream());
Log.i("DATA",
jsonString);
JSONObject
jsonObject;
NewsBean
newsBean;
try
{
jsonObject
=
new
JSONObject(jsonString);
JSONArray
jsonArray
=
jsonObject.getJSONArray("data");
for
(int
i
=
0;
i
<
jsonArray.length();
i++)
{
jsonObject
=
jsonArray.getJSONObject(i);
newsBean
=
new
NewsBean();
newsBean.content
=
jsonObject.getString("description");
newsBean.title
=
jsonObject.getString("name");
newsBean.viewUrl
=
jsonObject.getString("picSmall");
newsBeanList.add(newsBean);
}
}
catch
(JSONException
e)
{
e.printStackTrace();
}
}
catch
(IOException
e)
{
e.printStackTrace();
}
return
newsBeanList;
}
//*&*讀取數(shù)據(jù)流
private
String
readSteam(InputStream
is)
{
InputStreamReader
isr;
String
result
=
"";
try
{
String
line
=
"";
isr
=
new
InputStreamReader(is,
"utf-8");
BufferedReader
br
=
new
BufferedReader(isr);
try
{
while
((line
=
br.readLine())
!=
null)
{
result
+=
line;
}
}
catch
(IOException
e)
{
e.printStackTrace();
}
}
catch
(UnsupportedEncodingException
e)
{
e.printStackTrace();
}
return
result;
}
}3、自定義適配器(在此處設(shè)置滑動(dòng)監(jiān)聽(tīng),以此來(lái)判斷什么時(shí)候加載資源)package
com.example.leixiansheng.news;
import
android.content.Context;
import
android.view.LayoutInflater;
import
android.view.View;
import
android.view.ViewGroup;
import
android.widget.AbsListView;
import
android.widget.BaseAdapter;
import
android.widget.ImageView;
import
android.widget.ListView;
import
android.widget.TextView;
import
java.util.List;
/**
*
Created
by
Leixiansheng
on
2017/3/21.
*/
public
class
NewsAdapter
extends
BaseAdapter
implements
AbsListView.OnScrollListener{
private
List<NewsBean>
newsBeanList;
private
LayoutInflater
inflater;
private
ImageLoader
imageLoader;
//圖片加載
private
int
start;
//第一個(gè)元素
private
int
end;
//最后一個(gè)元素
private
boolean
isFirstIn;
//是否第一次進(jìn)入
public
static
String[]
URLS;
//所有資源
public
NewsAdapter(Context
context,
List<NewsBean>
newsBeanList,
ListView
listView)
{
this.newsBeanList
=
newsBeanList;
inflater
=
LayoutInflater.from(context);
imageLoader
=
new
ImageLoader(listView);
URLS
=
new
String[newsBeanList.size()];
for
(int
i
=
0;
i
<
newsBeanList.size();
i++)
{
URLS[i]
=
newsBeanList.get(i).viewUrl;
}
isFirstIn
=
true;
listView.setOnScrollListener(this);
}
@Override
public
int
getCount()
{
return
newsBeanList.size();
}
@Override
public
Object
getItem(int
i)
{
return
newsBeanList.get(i);
}
@Override
public
long
getItemId(int
i)
{
return
i;
}
@Override
public
View
getView(int
i,
View
view,
ViewGroup
viewGroup)
{
ViewHolder
viewHolder
=
null;
if
(view
==
null)
{
viewHolder
=
new
ViewHolder();
view
=
inflater.inflate(R.layout.item,
null);
viewHolder.imageView
=
(ImageView)
view.findViewById(R.id.image);
viewHolder.title
=
(TextView)
view.findViewById(R.id.title_tv);
viewHolder.content
=
(TextView)
view.findViewById(R.id.content_tv);
view.setTag(viewHolder);
}
else
{
viewHolder
=
(ViewHolder)
view.getTag();
}
String
url
=
newsBeanList.get(i).viewUrl;
viewHolder.imageView.setImageResource(R.mipmap.ic_launcher);
//*&*設(shè)置標(biāo)簽,避免快速滑動(dòng)listview出現(xiàn)位置誤差
viewHolder.imageView.setTag(url);
//
new
ImageLoader().showImageByThread(viewHolder.imageView,
url);
imageLoader.showImageViewByAsyncTask(viewHolder.imageView,url);
viewHolder.title.setText(newsBeanList.get(i).title);
viewHolder.content.setText(newsBeanList.get(i).content);
return
view;
}
//*&*優(yōu)化
class
ViewHolder
{
public
TextView
title;
public
TextView
content;
private
ImageView
imageView;
}
//滑動(dòng)監(jiān)聽(tīng)
@Override
public
void
onScrollStateChanged(AbsListView
absListView,
int
i)
{
if
(i
==
SCROLL_STATE_IDLE)
{
//停止?fàn)顟B(tài):加載圖片
imageLoader.loadImages(start,
end);
}
else
{
//滑動(dòng)狀態(tài):停止加載
imageLoader.cancelAllTasks();
}
}
/**
*
*
@param
absListView
*
@param
i
第一個(gè)元素
*
@param
i1
元素?cái)?shù)量
*
@param
i2
*/
@Override
public
void
onScroll(AbsListView
absListView,
int
i,
int
i1,
int
i2)
{
start
=
i;
end
=
i
+
i1;
//第一次進(jìn)入需要手動(dòng)加載
if
(isFirstIn
&&
i1
>
0)
{
imageLoader.loadImages(start,
end);
isFirstIn
=
false;
}
}
}package
com.example.leixiansheng.news;
import
android.graphics.Bitmap;
import
android.graphics.BitmapFactory;
import
android.os.AsyncTask;
import
android.os.Handler;
import
android.os.Message;
import
android.util.LruCache;
import
android.widget.ImageView;
import
android.widget.ListView;
import
java.io.BufferedInputStream;
import
java.io.IOException;
import
java.io.InputStream;
import
.HttpURLConnection;
import
.MalformedURLException;
import
.URL;
import
java.util.HashSet;
import
java.util.Set;
/**
*
Created
by
Leixiansheng
on
2017/3/21.
*/
public
class
ImageLoader
{
private
ImageView
mImageView;
private
String
mUrl;
//*&*創(chuàng)建緩存
private
LruCache<String,
Bitmap>
lruCache;
private
ListView
listview;
private
Set<NewsAsyncTask>
mTask;
public
ImageLoader(ListView
listview)
{
this.listview
=
listview;
mTask
=
new
HashSet<>();
//*&*獲取最大內(nèi)存
int
maxMemory
=
(int)
Runtime.getRuntime().maxMemory();
//設(shè)置緩存大小
int
lruCacheSize
=
maxMemory
/
4;
lruCache
=
new
LruCache<String,
Bitmap>(lruCacheSize)
{
@Override
protected
int
sizeOf(String
key,
Bitmap
value)
{
//獲取每個(gè)數(shù)據(jù)大小
return
value.getByteCount();
}
};
}
//添加數(shù)據(jù)到緩存
public
void
addBitmapToLruCache(String
url,
Bitmap
bitmap)
{
if
(getBitmapFromLruCache(url)
==
null)
{
lruCache.put(url,
bitmap);
}
}
//從緩存中獲取數(shù)據(jù)
public
Bitmap
getBitmapFromLruCache(String
url)
{
return
lruCache.get(url);
}
private
Handler
handler
=
new
Handler()
{
@Override
public
void
handleMessage(Message
msg)
{
super.handleMessage(msg);
if
(mImageView.getTag().equals(mUrl))
{
mImageView.setImageBitmap((Bitmap)
msg.obj);
}
}
};
public
void
showImageByThread(ImageView
imageView,
final
String
url)
{
mImageView
=
imageView;
mUrl
=
url;
new
Thread()
{
@Override
public
void
run()
{
super.run();
Bitmap
bitmap
=
getBitmapFromURL(url);
Message
message
=
Message.obtain();
message.obj
=
bitmap;
handler.sendMessage(message);
}
}.start();
}
public
Bitmap
getBitmapFromURL(String
urlString)
{
Bitmap
bitmap;
InputStream
is
=
null;
try
{
URL
url
=
new
URL(urlString);
HttpURLConnection
connection
=
(HttpURLConnection)
url.openConnection();
is
=
new
BufferedInputStream(connection.getInputStream());
bitmap
=
BitmapFactory.decodeStream(is);
connection.disconnect();
//模擬網(wǎng)速卡頓時(shí)
//
try
{
//
Thread.sleep(1000);
//
}
catch
(InterruptedException
e)
{
//
e.printStackTrace();
//
}
return
bitmap;
}
catch
(MalformedURLException
e)
{
e.printStackTrace();
}
catch
(IOException
e)
{
e.printStackTrace();
}
finally
{
try
{
is.close();
}
catch
(IOException
e)
{
e.printStackTrace();
}
}
return
null;
}
public
void
showImageViewByAsyncTask(ImageView
imageView,
String
url)
{
//判斷是否已經(jīng)緩存
Bitmap
bitmap
=
getBitmapFromLruCache(url);
//沒(méi)有緩存則從新下載
if
(bitmap
==
null)
{
imageView.setImageResource(R.mipmap.ic_launcher);
}
else
{
imageView.setImageBitmap(bitmap);
}
}
//加載從start到end的所有圖片
public
void
loadImages(int
start,
int
end)
{
for
(int
i
=
start;
i
<
end;
i++)
{
String
url
=
NewsAdapter.URLS[i];
//判斷是否已經(jīng)緩存
Bitmap
bitmap
=
getBitmapFromLruCache(url);
//沒(méi)有緩存則從新下載
if
(bitmap
==
null)
{
NewsAsyncTask
task
=
new
NewsAsyncTask(url);
task.execute(url);
mTask.add(task);
}
else
{
ImageView
imageView
=
(ImageView)
listview.findViewWithTag(url);
imageView.setImageBitmap(bitmap);
}
}
}
public
void
cancelAllTasks()
{
if
(mTask
!=
null)
{
for
(NewsAsyncTask
task
:
mTask)
{
task.cancel(false);
}
}
}
private
class
NewsAsyncTask
extends
AsyncTask<String,
Void,
Bitmap>
{
//
private
ImageView
imageView;
private
String
url;
public
NewsAsyncTask(String
url)
{
//
this.imageView
=
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶(hù)所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶(hù)上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶(hù)上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶(hù)因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2024年廣東公務(wù)員考試行測(cè)試題
- 2024婚禮司儀主持詞開(kāi)場(chǎng)白模版(33篇)
- 2024西安市房屋租賃合同范本(22篇)
- 2025年個(gè)人資產(chǎn)轉(zhuǎn)讓協(xié)議官方版
- 2025年代理出口合作協(xié)議范例
- 2025年農(nóng)村自用土地轉(zhuǎn)讓合同示例
- 2025年油污清潔劑項(xiàng)目立項(xiàng)申請(qǐng)報(bào)告模板
- 2025年公路清障車(chē)項(xiàng)目規(guī)劃申請(qǐng)報(bào)告模稿
- 2025年中國(guó)郵政快遞運(yùn)輸合同標(biāo)準(zhǔn)
- 2025年快遞員職業(yè)技能培訓(xùn)與發(fā)展協(xié)議
- 新教科版一年級(jí)科學(xué)下冊(cè)第一單元《身邊的物體》全部課件(共7課時(shí))
- 2025年中國(guó)水解聚馬來(lái)酸酐市場(chǎng)調(diào)查研究報(bào)告
- 高考百日誓師動(dòng)員大會(huì)
- 2025江蘇常州西太湖科技產(chǎn)業(yè)園管委會(huì)事業(yè)單位招聘8人歷年高頻重點(diǎn)提升(共500題)附帶答案詳解
- 2025年北京控股集團(tuán)有限公司招聘筆試參考題庫(kù)含答案解析
- 2024年北京東城社區(qū)工作者招聘筆試真題
- 信息技術(shù)必修一《數(shù)據(jù)與計(jì)算》第三章第三節(jié)《數(shù)據(jù)分析報(bào)告與應(yīng)用》說(shuō)課稿
- 2024新人教版初中英語(yǔ)單詞表默寫(xiě)版(七~九年級(jí))
- 體育科學(xué)急救知識(shí)
- 復(fù)工復(fù)產(chǎn)質(zhì)量管理工作
- 2025年?yáng)|方電氣集團(tuán)東方鍋爐股份限公司校園招聘高頻重點(diǎn)提升(共500題)附帶答案詳解
評(píng)論
0/150
提交評(píng)論