【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第1頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第2頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第3頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第4頁(yè)
【移動(dòng)應(yīng)用開(kāi)發(fā)技術(shù)】怎么Android應(yīng)用中實(shí)現(xiàn)一個(gè)APP顯示界面滑動(dòng)優(yōu)化_第5頁(yè)
已閱讀5頁(yè),還剩10頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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ì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論