欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

XListView實現(xiàn)網絡加載圖片和下拉刷新

 更新時間:2018年11月23日 14:48:45   作者:FanRQ_  
這篇文章主要為大家詳細介紹了XListView實現(xiàn)網絡加載圖片和下拉刷新,具有一定的參考價值,感興趣的小伙伴們可以參考一下

 本文實例為大家分享了XListView實現(xiàn)網絡加載圖片,和下拉刷新的功能,供大家參考,具體內容如下

MainActivity.java

public class MainActivity extends AppCompatActivity {

 private XListView contents;

 private int page = 0;
 private MyBaseAdapter adapter;

 @Override
 protected void onCreate(Bundle savedInstanceState) {
  super.onCreate(savedInstanceState);
  setContentView(R.layout.activity_main);

  contents = findViewById(R.id.contents);
  adapter = new MyBaseAdapter(getLayoutInflater());
  contents.setAdapter(adapter);

  //是否開啟下拉刷新 上拉加載
  //contents.setPullRefreshEnable(false);
  contents.setPullLoadEnable(true);

  contents.setXListViewListener(new XListView.IXListViewListener() {
   @Override public void onRefresh() {
    page = 0;
    loadData(page);
    //加載刷新數(shù)據(jù)
   }

   @Override public void onLoadMore() {
    loadData(page);
   }
  });

  //一進來就去加載第一頁數(shù)據(jù)
  loadData(page);
 }

 private String url =
   "http://apis.juhe.cn/cook/query?key=3ec004200a6a2f4cf4774e480c006375&menu=%E8%A5%BF%E7%BA%A2%E6%9F%BF&rn=10&pn=";

 private void loadData(int page) {
  String requestUrlWithPageNum = url + page;

  //加載網絡數(shù)據(jù)
  new AsyncTask<String, Void, List<DataItem>>() {

   @Override protected List<DataItem> doInBackground(String... strings) {
    ResponseBean responseBean = null;
    try {
     URL url = new URL(strings[0]);
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();
     urlConnection.setRequestMethod("GET");
     urlConnection.setConnectTimeout(5000);
     urlConnection.setReadTimeout(5000);

     int responseCode = urlConnection.getResponseCode();
     if (responseCode == 200) {
      String str = stream2String(urlConnection.getInputStream());
      responseBean = new Gson().fromJson(str, ResponseBean.class);
     } else {
      //
     }
     return responseBean == null ? null : responseBean.getResult().getData();
    } catch (MalformedURLException e) {
     e.printStackTrace();
    } catch (IOException e) {
     e.printStackTrace();
    }

    return null;
   }

   @Override protected void onPostExecute(List<DataItem> dataItems) {
    if (dataItems == null) {
     Toast.makeText(MainActivity.this, "請求數(shù)據(jù)錯誤", Toast.LENGTH_LONG).show();
     return;
    }

    //更新數(shù)據(jù)
    updateData(dataItems);
    loadCompleted();
   }
  }.execute(url);
 }

 private String stream2String(InputStream is) throws IOException {
  BufferedReader br = new BufferedReader(new InputStreamReader(is));
  StringBuilder sb = new StringBuilder();
  for (String tmp = br.readLine(); tmp != null; tmp = br.readLine()) {
   sb.append(tmp);
  }

  return sb.toString();
 }

 private void updateData(List<DataItem> datas) {
  if (page == 0) {
   adapter.setDatas(datas);
  } else {
   adapter.addDatas(datas);
  }
 }

 //通過 加載 / 刷新 完成
 private void loadCompleted() {
  //通過ListView:刷新、加載完成
  page++;
  contents.stopLoadMore();
  contents.stopRefresh();
 }
}

MyBaseAdapter.java

public class MyBaseAdapter extends BaseAdapter {

 private List<DataItem> mDatas;
 protected LayoutInflater mInflater;

 /**
  * 更新數(shù)據(jù)
  */
 public void setDatas(List<DataItem> datas) {
  mDatas.clear();
  if (datas != null) {
   mDatas.addAll(datas);
  }
  notifyDataSetChanged();
 }

 /**
  * 追加數(shù)據(jù)
  */
 public void addDatas(List<DataItem> datas) {
  if (datas != null) {
   mDatas.addAll(datas);
   notifyDataSetChanged();
  }
 }

 public MyBaseAdapter(LayoutInflater mInflater) {
  this.mInflater = mInflater;
  mDatas = new ArrayList<>();
 }

 @Override public int getCount() {
  return mDatas.size();
 }

 @Override public DataItem getItem(int position) {
  return mDatas.get(position);
 }

 @Override public long getItemId(int position) {
  return position;
 }

 @Override public View getView(int position, View convertView, ViewGroup parent) {
  BaseViewHolder viewHolder = null;

  if (convertView == null) {
   convertView = mInflater.inflate(R.layout.item, parent, false);
   viewHolder = new BaseViewHolder(convertView);
  } else {
   viewHolder = (BaseViewHolder) convertView.getTag();
  }

  viewHolder.bindData(getItem(position));

  return convertView;
 }

 public class BaseViewHolder {
  private View itemView;

  private ImageView icon;
  private TextView title;
  private TextView date;

  public BaseViewHolder(View itemView) {
   this.itemView = itemView;
   title = itemView.findViewById(R.id.title);
   date = itemView.findViewById(R.id.date);
   icon = itemView.findViewById(R.id.icon);

   itemView.setTag(this);
  }

  public void bindData(DataItem dataItem) {
   title.setText(dataItem.getTitle());
   date.setText(dataItem.getId());
   ImageLoader.getInstance().displayImage(dataItem.getFirstImageUrl(), icon,
     ImageLoaderConfigs.getDefaultDisplayImageOptions(icon.getContext()));
  }
 }
}
ImageLoader.java
  public class ImageLoaderConfigs {
 public static ImageLoaderConfiguration getImageLoaderConfiguration(Context context) {
  ImageLoaderConfiguration configuration = new ImageLoaderConfiguration.Builder(context)
    //內在緩存額外選項, 最大的寬度,高度
    //.memoryCacheExtraOptions(480, 800) // default = device screen dimensions 內存緩存文件的最大長寬
    //.diskCacheExtraOptions(480, 800, null) // 本地緩存的詳細信息(緩存的最大長寬),最好不要設置這個
    //線程池配置
    //.taskExecutor()
    //.taskExecutorForCachedImages()
    //.threadPoolSize(3) // default 線程池內加載的數(shù)量
    //.threadPriority(Thread.NORM_PRIORITY - 2) // default 設置當前線程的優(yōu)先級
    //任務處理優(yōu)先級 Fist In Fist Out
    //.tasksProcessingOrder(QueueProcessingType.FIFO) // default
    //內存中不緩存一張圖片的多個尺寸大小
    //.denyCacheImageMultipleSizesInMemory()
    //內在緩存策略
    //.memoryCache(new LruMemoryCache(2 * 1024 * 1024)) //可以通過自己的內存緩存實現(xiàn)
    //內存緩存大小
    //.memoryCacheSize(2 * 1024 * 1024) // 內存緩存的最大值
    //內在緩存大?。赫加冒俜直?
    .memoryCacheSizePercentage(13) // default
    //磁盤緩存策略
    //.diskCache(new LruDiskCache()) // default 可以自定義緩存路徑
    //磁盤緩存大小
    .diskCacheSize(50 * 1024 * 1024) // 50 Mb sd卡(本地)緩存的最大值
    //.diskCacheFileCount(100) // 可以緩存的文件數(shù)量
    // default為使用HASHCODE對UIL進行加密命名, 還可以用MD5(new Md5FileNameGenerator())加密
    //.diskCacheFileNameGenerator(new HashCodeFileNameGenerator())
    //.imageDownloader(new BaseImageDownloader(context)) // default
    //(new BaseImageDecoder(false)) // default
    //加載具體圖片時的一些配置
    .defaultDisplayImageOptions(DisplayImageOptions.createSimple()) // default
    .writeDebugLogs() // 打印debug log
    .build();

  return configuration;
 }

 public static DisplayImageOptions getDefaultDisplayImageOptions(Context context) {
  DisplayImageOptions displayImageOptions = new DisplayImageOptions.Builder()
    //是否緩存
    .cacheInMemory(true)
    .cacheOnDisk(true)
    //RGB 565  r紅色占5  g綠色占6  b藍色占5 -> 2字節(jié)
    //alpha
    //ARGB 4444  4 4 4 4 -> 2字節(jié)
    //ARGB 8888  -> 4字節(jié)

    //10 * 10 用rgb565 -> 10*10*2

    .bitmapConfig(Bitmap.Config.RGB_565)
    //加載時、加載錯誤時展示什么內容
    .showImageOnLoading(R.mipmap.ic_launcher)
    .showImageOnFail(R.mipmap.ic_launcher)
    //
    .imageScaleType(ImageScaleType.EXACTLY_STRETCHED)

    //加載效果
    //ctrl + p
    .displayer(new CircleBitmapDisplayer())
    .build();

  //ctrl + h
  //BitmapDisplayer;
  return displayImageOptions;
 }
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • FFmpeg?音頻可視化解碼流程詳解

    FFmpeg?音頻可視化解碼流程詳解

    這篇文章主要為大家介紹了FFmpeg?音頻可視化解碼流程詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • Android中ActionBar以及menu的代碼設置樣式

    Android中ActionBar以及menu的代碼設置樣式

    這篇文章主要介紹了Android中ActionBar以及menu的代碼設置樣式的相關資料,需要的朋友可以參考下
    2015-07-07
  • 從0快速搭建一個實用的MVVM框架(超詳細)

    從0快速搭建一個實用的MVVM框架(超詳細)

    這篇文章主要介紹了從0搭建一個實用的MVVM框架,結合Jetpack,構建快速開發(fā)的MVVM框架,支持快速生成ListActivity、ListFragment,主要是基于MVVM進行快速開發(fā)上手即用,需要的朋友可以參考下
    2022-03-03
  • Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例

    Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例

    本篇文章主要介紹了Android中使用GridView和ImageViewSwitcher實現(xiàn)電子相冊簡單功能實例,具有一定的參考價值,有需要的可以了解一下。
    2016-12-12
  • Android 通用型手電筒代碼

    Android 通用型手電筒代碼

    說到手機手電筒功能,很多人都是直接調用閃光燈,而本文給大家介紹的是用相機功能來實現(xiàn)的,有需要的小伙伴可以參考下。
    2015-06-06
  • Android內存泄漏導致原因深入探究

    Android內存泄漏導致原因深入探究

    內存管理的目的就是讓我們在開發(fā)過程中有效避免我們的應用程序出現(xiàn)內存泄露的問題。內存泄露相信大家都不陌生,我們可以這樣理解:沒有用的對象無法回收的現(xiàn)象就是內存泄露
    2023-02-02
  • Kotlin?coroutineContext源碼層深入分析

    Kotlin?coroutineContext源碼層深入分析

    表示一個元素或者是元素集合的接口。它有一個Key(索引)的Element實例集合,每一個Element的實例也是一個CoroutineContext,即集合中每個元素也是集合
    2022-11-11
  • Android自定義狀態(tài)欄顏色與APP風格保持一致的實現(xiàn)方法

    Android自定義狀態(tài)欄顏色與APP風格保持一致的實現(xiàn)方法

    我們知道iOS上的應用,狀態(tài)欄的顏色總能與應用標題欄顏色保持一致,用戶體驗很不錯,那安卓是否可以呢?下面小編給大家?guī)砹薃ndroid自定義狀態(tài)欄顏色與APP風格保持一致的實現(xiàn)方法,跟著小編一起學習吧
    2016-10-10
  • android自定義加減按鈕

    android自定義加減按鈕

    這篇文章主要為大家詳細介紹了android自定義加減按鈕,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • Android實現(xiàn)京東App分類頁面效果

    Android實現(xiàn)京東App分類頁面效果

    這篇文章主要為大家詳細介紹了Android實現(xiàn)京東App分類頁面效果,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02

最新評論