如何在android中的ListView实现图片的异步加载?

想要实现对ListView Item 中图片的加载?各位帮忙怎么实现?

suannai0314
鹳狸媛 百度一下,各种demo
7 年多之前 回复

3个回答

我封装了一个异步加载类 开放源码并且提供示例代码

这是地址ImageAsyncLoader

lonewolf521125
杨筱毅 链接失效了。。。
6 年多之前 回复
zhenglingkun
WindKun 这位写的不错哦!大家可以下下来看一看!
7 年多之前 回复

Java代码

package cn.wangmeng.test;

import java.io.IOException;

import java.io.InputStream;

import java.lang.ref.SoftReference;

import java.net.MalformedURLException;

import java.net.URL;

import java.util.HashMap;

import android.graphics.drawable.Drawable;

import android.os.Handler;

import android.os.Message;

public class AsyncImageLoader {

 private HashMap<String, SoftReference<Drawable>> imageCache;  

     public AsyncImageLoader() {  
         imageCache = new HashMap<String, SoftReference<Drawable>>();  
     }  

     public Drawable loadDrawable(final String imageUrl, final ImageCallback imageCallback) {  
         if (imageCache.containsKey(imageUrl)) {  
             SoftReference<Drawable> softReference = imageCache.get(imageUrl);  
             Drawable drawable = softReference.get();  
             if (drawable != null) {  
                 return drawable;  
             }  
         }  
         final Handler handler = new Handler() {  
             public void handleMessage(Message message) {  
                 imageCallback.imageLoaded((Drawable) message.obj, imageUrl);  
             }  
         };  
         new Thread() {  
             @Override  
             public void run() {  
                 Drawable drawable = loadImageFromUrl(imageUrl);  
                 imageCache.put(imageUrl, new SoftReference<Drawable>(drawable));  
                 Message message = handler.obtainMessage(0, drawable);  
                 handler.sendMessage(message);  
             }  
         }.start();  
         return null;  
     }  

    public static Drawable loadImageFromUrl(String url) {  
        URL m;  
        InputStream i = null;  
        try {  
            m = new URL(url);  
            i = (InputStream) m.getContent();  
        } catch (MalformedURLException e1) {  
            e1.printStackTrace();  
        } catch (IOException e) {  
            e.printStackTrace();  
        }  
        Drawable d = Drawable.createFromStream(i, "src");  
        return d;  
    }  

     public interface ImageCallback {  
         public void imageLoaded(Drawable imageDrawable, String imageUrl);  
     }  

}

以上代码是实现异步获取图片的主方法,SoftReference是软引用,是为了更好的为了系统回收变量,重复的URL直接返回已有的资源,实现回调函数,让数据成功后,更新到UI线程。
几个辅助类文件:
Java代码

package cn.wangmeng.test;

public class ImageAndText {

private String imageUrl;

private String text;

    public ImageAndText(String imageUrl, String text) {  
        this.imageUrl = imageUrl;  
        this.text = text;  
    }  
    public String getImageUrl() {  
        return imageUrl;  
    }  
    public String getText() {  
        return text;  
    }  

}

Java代码

package cn.wangmeng.test;

import android.view.View;

import android.widget.ImageView;

import android.widget.TextView;

public class ViewCache {

    private View baseView;  
    private TextView textView;  
    private ImageView imageView;  

    public ViewCache(View baseView) {  
        this.baseView = baseView;  
    }  

    public TextView getTextView() {  
        if (textView == null) {  
            textView = (TextView) baseView.findViewById(R.id.text);  
        }  
        return textView;  
    }  

    public ImageView getImageView() {  
        if (imageView == null) {  
            imageView = (ImageView) baseView.findViewById(R.id.image);  
        }  
        return imageView;  
    }  

}

ViewCache是辅助获取adapter的子元素布局
Java代码

package cn.wangmeng.test;

import java.util.List;

import cn.wangmeng.test.AsyncImageLoader.ImageCallback;

import android.app.Activity;

import android.graphics.drawable.Drawable;

import android.view.LayoutInflater;

import android.view.View;

import android.view.ViewGroup;

import android.widget.ArrayAdapter;

import android.widget.ImageView;

import android.widget.ListView;

import android.widget.TextView;

public class ImageAndTextListAdapter extends ArrayAdapter {

    private ListView listView;  
    private AsyncImageLoader asyncImageLoader;  

    public ImageAndTextListAdapter(Activity activity, List<ImageAndText> imageAndTexts, ListView listView) {  
        super(activity, 0, imageAndTexts);  
        this.listView = listView;  
        asyncImageLoader = new AsyncImageLoader();  
    }  

    public View getView(int position, View convertView, ViewGroup parent) {  
        Activity activity = (Activity) getContext();  

        // Inflate the views from XML  
        View rowView = convertView;  
        ViewCache viewCache;  
        if (rowView == null) {  
            LayoutInflater inflater = activity.getLayoutInflater();  
            rowView = inflater.inflate(R.layout.image_and_text_row, null);  
            viewCache = new ViewCache(rowView);  
            rowView.setTag(viewCache);  
        } else {  
            viewCache = (ViewCache) rowView.getTag();  
        }  
        ImageAndText imageAndText = getItem(position);  

        // Load the image and set it on the ImageView  
        String imageUrl = imageAndText.getImageUrl();  
        ImageView imageView = viewCache.getImageView();  
        imageView.setTag(imageUrl);  
        Drawable cachedImage = asyncImageLoader.loadDrawable(imageUrl, new ImageCallback() {  
            public void imageLoaded(Drawable imageDrawable, String imageUrl) {  
                ImageView imageViewByTag = (ImageView) listView.findViewWithTag(imageUrl);  
                if (imageViewByTag != null) {  
                    imageViewByTag.setImageDrawable(imageDrawable);  
                }  
            }  
        });  
        if (cachedImage == null) {  
            imageView.setImageResource(R.drawable.default_image);  
        }else{  
            imageView.setImageDrawable(cachedImage);  
        }  
        // Set the text on the TextView  
        TextView textView = viewCache.getTextView();  
        textView.setText(imageAndText.getText());  

        return rowView;  
    }  

}

ImageAndTextListAdapter是实现ListView的Adapter,里面有个技巧就是imageView.setTag(imageUrl),setTag是存储数据的,这样是为了保证在回调函数时,listview去更新自己对应item,大家仔细阅读就知道了。
最后贴出布局文件:
Xml代码

<?xml version="1.0" encoding="utf-8"?>

android:orientation="horizontal"
android:layout_width="fill_parent"
android:layout_height="wrap_content">

    <ImageView android:id="@+id/image"  
               android:layout_width="wrap_content"  
               android:layout_height="wrap_content"  
               />  

    <TextView android:id="@+id/text"  
              android:layout_width="wrap_content"  
              android:layout_height="wrap_content"/>  

zhenglingkun
WindKun 这个方法不错!我用了一下,你也可以看看我采纳的那一个,也是很不错的!
7 年多之前 回复

AsyncLoader或者AsyncTask都行,你看看apidemos里面的代码,有例子。。。。。。

zhenglingkun
WindKun 这人你有完整的Demo吗?
7 年多之前 回复
cytown
Billy_崔海斌 当然可以了 参见 http://developer.android.com/training/displaying-bitmaps/process-bitmap.html
7 年多之前 回复
sasuke38
Jobernowl ListView中的item有很多 不可能用AsyncTask来吧 除非用AsyncTask来加载完所有item在显示出来 但是一般做法是一个个item的加载 用普通线程就行了
7 年多之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
其他相关推荐
Android ListView图片异步加载和上拉加载
我的ListView设置一个OnScrollListener,然后更加可见的item数目来异步加载图片,和缓存图片, 但同时这个ListView又是个第三方的带上拉加载的,第三方的代码里也注册了OnScrollListener, 因此这两个OnScrollListener,只能有一个生效,但我想把上拉加载和异步加载图片的逻辑, 都写在同一个OnScrollListener,有什么好的设计吗? 问题在于上拉加载是在第三方的库中,而异步加载图片是在自己的代码中
android listview去掉黑线
android仿淘宝展示商品详情,利用listview异步加载网络图片,怎么去掉listview的黑线
android listview内存溢出
listview异步加载网络图片,使用了SoftReference还是内存溢出,该怎么办?急用
实现视频缩略图 在listview上进行的显示效果
在做视频缩略图项目方面,在我拿到了视频的 路径,bitmap,等详细信息后,需要显示在listview上 ,在getView上直接显示了缩略图,但是这种方式的会很延迟,因为要拿视频详细信息时要延时。这种效果不是我想要的; 我希望可以在getview里异步加载视频缩略图。希望有大神给点意见
大家帮我看下listview 异步加载数据 分页的问题!!!
网上有大量介绍listview分页的文章,但都是一些基础,下面我用的是 异步从服务端获取数据,然后绑定到listview里面,服务端程序也是一个大家常见的分页的程序,现在出现一些问题,滑动滚动条加载下一页内容时上一页的内容没有了,大家能不能帮着看看,先谢了! public class SearchList extends CommonActivity implements OnScrollListener, OnClickListener ,OnItemClickListener{ private String wherestr="",orderstr=" autoid desc"; private int lastItem = 0; ImageAndTextListAdapter adapter; LinearLayout loadingLayout; /** * 设置布局显示属性 */ private LayoutParams mLayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.WRAP_CONTENT, LinearLayout.LayoutParams.WRAP_CONTENT); /** * 设置布局显示目标最大化属性 */ private LayoutParams FFlayoutParams = new LinearLayout.LayoutParams( LinearLayout.LayoutParams.FILL_PARENT, LinearLayout.LayoutParams.FILL_PARENT); private ProgressBar progressBar; private ListView list; // 获得数据集合 private List<ImageAndText> dataArray = new ArrayList<ImageAndText>(); private int mCurrentPage = Constants.PAGE_FIRST; private int mTotalPage, mTotalCount; // 组件声明 private EditText searchTxt = null; private TextView recent_view_topnotifybar = null; private ImageView locate_my=null;//搜索确定 private ImageView record_cordition=null; //搜索详细 private ImageView go_filter2=null; private String Flag=""; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.searchlist); searchTxt = (EditText) findViewById(R.id.search_edittext); recent_view_topnotifybar = (TextView) findViewById(R.id.recent_view_topnotifybar); locate_my=(ImageView)findViewById(R.id.locate_my); record_cordition=(ImageView)findViewById(R.id.record_cordition); go_filter2=(ImageView)findViewById(R.id.go_filter2); searchTxt.setOnClickListener(this); locate_my.setOnClickListener(this); record_cordition.setOnClickListener(this); go_filter2.setOnClickListener(this); // 线性布局 LinearLayout layout = new LinearLayout(this); // 设置布局 水平方向 layout.setOrientation(LinearLayout.HORIZONTAL); // 进度条 progressBar = new ProgressBar(this); // 进度条显示位置 progressBar.setPadding(0, 0, 15, 0); // 把进度条加入到layout中 layout.addView(progressBar, mLayoutParams); // 文本内容 TextView textView = new TextView(this); textView.setText("加载中..."); textView.setGravity(Gravity.CENTER_VERTICAL); // 把文本加入到layout中 layout.addView(textView, FFlayoutParams); // 设置layout的重力方向,即对齐方式是 layout.setGravity(Gravity.CENTER); // 设置ListView的页脚layout loadingLayout = new LinearLayout(this); loadingLayout.addView(layout, mLayoutParams); loadingLayout.setGravity(Gravity.CENTER); // ============================================= list = (ListView) findViewById(R.id.list); list.setOnItemClickListener(this); } // @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); // load new QueryTask().execute(); } // 单击事件 public void onClick(View v) { // TODO Auto-generated method stub Intent intent=null; switch (v.getId()) { case R.id.search_edittext://点击搜索文本框内容清空文本框 searchTxt.setText(""); break; case R.id.locate_my:// 搜索确定 String str=searchTxt.getText().toString(); if(str.equals("")||str.equals("车辆品牌")) Toast.makeText(this, "请输入查询关键词!", Toast.LENGTH_LONG).show(); else { this.wherestr=str;//查询条件 dataArray.clear(); new QueryTask().execute(); } break; case R.id.record_cordition:// 进入搜索的详细页 intent = new Intent(SearchList.this, ZoneMain.class); startActivity(intent); break; case R.id.go_filter2:// 点击筛选进入筛选页,但要返回筛选条件 intent = new Intent(SearchList.this, FilterSearch.class); startActivity(intent); break; } } // public void onScroll(AbsListView view, int firstVisibleItem, int visibleItemCount, int totalItemCount) { //Log.e("onscroll adapter.coun", adapter.count + ""); // TODO Auto-generated method stub lastItem = firstVisibleItem + visibleItemCount - 1; //如果当前页小于总页数 就需要加载 if (mCurrentPage <= mTotalPage) { if (firstVisibleItem + visibleItemCount == totalItemCount) { //adapter.count += 5; mCurrentPage++; new QueryTask().execute(); adapter.notifyDataSetChanged(); list.setSelection(lastItem); // mCurrentPage=2; // mCurrentPage = adapter.count / 5;// 当前页? // Toast.makeText(getApplicationContext(), // "第" + mCurrentPage + "页", Toast.LENGTH_LONG).show(); } } else { list.removeFooterView(loadingLayout); } } // public void onScrollStateChanged(AbsListView view, int scrollState) { // TODO Auto-generated method stub } // 加载数据 class QueryTask extends CommonTask<Void> { private CarSearchListReq getListReq = null; // 实例化此方法后就已经开始加载服务端的数据了 private CarSearchListResp getListResp = new CarSearchListResp(); public QueryTask() { super(SearchList.this, getString(R.string.get_data)); // TODO Auto-generated constructor stub } protected Void doInBackground(Void... params) { // TODO Auto-generated method stub this.getListReq = new CarSearchListReq(); this.getListReq.wherestr = SearchList.this.wherestr; this.getListReq.orderstr = SearchList.this.orderstr; // 这个必须存在 mCurrentPage赋值改变记录查询 this.getListReq.pageIndex = mCurrentPage; InputStream is = null; HttpConnectWrapper httpCon = new HttpConnectWrapper(); try { is = httpCon.httpPost(getListReq.getData(), getListReq .getNeedRespHeaderProps()); getListResp.parse(is); } catch (Exception e) { } return super.doInBackground(params); } protected void onPostExecute(Void result) { // TODO Auto-generated method stub super.onPostExecute(result); int hRet = this.getListResp.getData(); if (hRet == 1 || hRet == 1004) { dataArray = this.getListResp.InfoList; // 总记录数 mTotalCount = this.getListResp.count; // 总页数 mTotalPage = mTotalCount % PAGE_MAX_LINE == 0 ? mTotalCount / PAGE_MAX_LINE : mTotalCount / PAGE_MAX_LINE + 1; setPage(); if (hRet == 1004) { } } else { } } } /** * 设置ListView */ private void setPage() { adapter = new ImageAndTextListAdapter(this, dataArray, list); // 添加到脚页显示 list.addFooterView(loadingLayout); list.setAdapter(adapter); // 给ListView注册滚动监听 list.setOnScrollListener(this); } //单击列表促发事件 public void onItemClick(AdapterView<?> arg0, View arg1, int arg2, long arg3) { // TODO Auto-generated method stub if (arg2 != -1) { Intent intent=new Intent(SearchList.this,CarDetail.class); intent.putExtra("AutoID", dataArray.get(arg2).AutoId.toString()); startActivity(intent); } }
android里引入viewflow控件里放置listview控件,滑动过快时listview失去焦点
我看91助手主UI做的就比较好,我模仿做一个,我在适配器里用来AsyncTask异步加载,加载成功时调用notifyDataSetChanged()更新UI,但效果出来了,就是listview不稳定,容易失去焦点,有没有对滑动标签viewflow比较熟悉的啊,该怎么解决啊?
实现视频播放器缩略图显示在listview上的功能
现在在学Android开始自己做一个视频播放器,但是在视频缩略图那边卡住了,参照网上查到的资料,用bitmap获取到了视频缩略图直接显示在item里面的imageview上面,但是每次加载都要很久,看了异步加载很多都看不太懂,有没有哪位大大可以指教下,有demo最好啦,谢谢~
android4.2 在listview中解析带有img标签的html,并显示在textview中
代码均在listeview的适配器里,主要代码如下: public View getView(int position, View v, ViewGroup parent) { LiveContextHolder lvcHolder; if (v == null) { v = inflater.inflate(R.layout.live_contxt_item, null); lvcHolder = new LiveContextHolder(); lvcHolder.txtv_time = (TextView) v .findViewById(R.id.lvcitm_txtv_time); lvcHolder.txtv_contxt = (TextView) v .findViewById(R.id.lvcitm_txtv_contxt); lvcHolder.txtv_rmax = (TextView) v .findViewById(R.id.lvcitm_txtv_rmax); lvcHolder.txtv_qmax = (TextView) v .findViewById(R.id.lvcitm_txtv_qmax); v.setTag(lvcHolder); } else { lvcHolder = (LiveContextHolder) v.getTag(); } LiveContxt lvc = liveContxts.get(position); lvcHolder.txtv_time.setText(lvc.getTime()); lvcHolder.txtv_qmax.setText(lvc.getQmax()); lvcHolder.txtv_rmax.setText(lvc.getRmax()); CharSequence html; String html_c = lvc.getM_alias()+": "+StringCL.rplceStr(lvc.getContxt()); StringBuffer html_r = new StringBuffer(""); if (lvc.getRplyLst() != null && lvc.getRplyLst().size() > 0) { for (RplyContxt rply : lvc.getRplyLst()) { html_r.append("--答--").append(rply.getM_alias()).append(":") .append(StringCL.rplceStr(rply.getRply())); html_r.append(" "); } } html = Html.fromHtml(html_c + " " +html_r.toString(),imageGetter,null); lvcHolder.txtv_contxt.setText(html); return v; } final Html.ImageGetter imageGetter = new Html.ImageGetter() { public Drawable getDrawable(String source) { //source="http://192.168.0.145:8888/hxzb/data/Image/2013-06/20130609152823009.jpg"; // 在此必须异步加载图片 Drawable d = null; try { InputStream is = new DefaultHttpClient().execute(new HttpGet(source)).getEntity().getContent(); Bitmap bm = BitmapFactory.decodeStream(is); d = new BitmapDrawable(context.getResources(), bm); d.setBounds(0, 0, d.getIntrinsicWidth(), d.getIntrinsicWidth()); } catch (Exception e) { e.printStackTrace(); } return d; } }; 问题在于在imageGetter时要开线程,但开线程也会引发其他问题,如图片还么下载完,函数就已经返回了,会有空值,并且我也不知怎么写这个线程,望高手指导!!!
异步加载数据导致原本正确的点击事件失效
Android项目,原本正确的listview-itemclick和系统back键点击失效,只能在item刚出来的时候点击一次就失效了,item 出现久了一次都点击不了,系统的back键也会导致程序卡住,并且back无效, 无论是AsyncTask还是Handler+Thread都是一样的效果,请问是怎么回事?卡了很久了 网上也找不到解决办法
android ListView 做下拉刷新 下拉跳到第一项怎么解决
listView.setonRefreshListener(new OnRefreshListener() { @Override public void onRefresh() { Log.e(TAG, "---下拉刷新---"); new AsyncTask<Void, Void, Void>() { protected Void doInBackground(Void... params) { try { mylineslistlist.clear(); mylinesorderlist.clear(); list.clear(); getMylines(0); } catch (Exception e) { e.printStackTrace(); } return null; } protected void onPostExecute(Void result) { adapter.notifyDataSetChanged(); listView.onRefreshComplete(); } }.execute(); } }); listView.setOnScrollListener(new OnScrollListener() { @Override public void onScrollStateChanged(final AbsListView view, int scrollState) { listView.onScrollStateChanged(view, scrollState); // 数据为空--不用继续下面代码了 if (list.size() == 0) return; // 判断是否滚动到底部 boolean scrollEnd = false; try { if (view.getPositionForView(loadingLayout) == view .getLastVisiblePosition()) scrollEnd = true; } catch (Exception e) { scrollEnd = false; } if (scrollEnd) { // 如果是自动加载,可以在这里放置异步加载数据的代码 Log.e("LOADMORE", "loading..."); if (currentPage < pageNum) { // Log.e(TAG, "---currentPage is " + currentPage); currentPage++; // Log.e(TAG, "---currentPage is " + currentPage); handler.postDelayed(new Runnable() { @Override public void run() { // Log.d(TAG, "---loadData page is" + // currentPage); getMylines(currentPage); // listView.setSelection(view // .getLastVisiblePosition() - 1); // 设置选中项 // setLoadView("加载更多"); //恢复按钮文字 } }, 1000); } else { listView.removeFooterView(loadingLayout); } } }
求大神帮助,使用Bmob服务器,获取数据解析数据???我还使用异步加载
//我建立了Bean,里面有一个ImageView,两个TextView, //ImageView id=imgView; //TextView id=tittle; //TextView id=content; //BaseAdapter在最下面列出来; //ListView布局是activity_main; //item布局是item_layout; 我都是按照视频写的,基础差,请见谅 ``` package com.bmoblist; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.ArrayList; import java.util.List; import org.json.JSONArray; import org.json.JSONObject; import org.json.JSONStringer; import android.app.Activity; import android.os.AsyncTask; import android.os.Bundle; import android.widget.BaseAdapter; import android.widget.ListAdapter; import android.widget.ListView; import android.widget.Toast; import cn.bmob.v3.Bmob; import cn.bmob.v3.BmobQuery; import cn.bmob.v3.listener.FindListener; import cn.volley.toolbox.JsonObjectRequest; public class MainActivity extends Activity { private ListView listView; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); // 初始化 Bmob SDK // 使用时请将第二个参数Application ID替换成你在Bmob服务器端创建的Application ID Bmob.initialize(this, "这里是就不透露了"); ZhinengBean zhinengBean = new ZhinengBean(); ListView listView = (ListView)findViewById(R.layout.activity_main); } //这一步完全不知道怎么弄 private List<ZhinengBean> getJsonData(){ //bmobString不知道写啥 List<ZhinengBean> zhinengBeanList = new ArrayList<>(); String jsonString = readStream(ZhinengBean.openStream()); return null; } private String readStream(InputStream is){ InputStreamReader isr; String result = ""; try { String line =""; isr = new InputStreamReader(is,"utf-8"); BufferedReader br = new BufferedReader(isr); while ((line=br.readLine()) != null){ result += line; } } catch (UnsupportedEncodingException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } catch (IOException e) { // TODO 自动生成的 catch 块 e.printStackTrace(); } return result; } class NewsAsyncTask extends AsyncTask<String,Void,List<ZhinengBean>>{ @Override protected List<ZhinengBean> doInBackground(String... params) { // TODO 自动生成的方法存根 return getJsonData(params[0]); //不知道怎么写 } } } ``` ``` package com.bmoblist; import java.util.List; import android.content.Context; import android.media.Image; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; import android.widget.BaseAdapter; import android.widget.ImageView; import android.widget.TextView; public class MyAdapter extends BaseAdapter { //通过构造方法,将数据源和适配器绑定在一起》》》》 private List<ZhinengBean> mList; private LayoutInflater mInflater; public MyAdapter (Context context,List<ZhinengBean> list){ mList = list; mInflater = LayoutInflater.from(context); } //》》》》》》》 //表示显示多少条数据 @Override public int getCount() { // TODO 自动生成的方法存根 return mList.size(); } @Override public Object getItem(int position) { // TODO 自动生成的方法存根 return mList.get(position); } @Override public long getItemId(int position) { // TODO 自动生成的方法存根 return position; } @Override public View getView(int position, View converView, ViewGroup parent) { // TODO 自动生成的方法存根 ViewHolder viewHolder; if(converView == null){ viewHolder = new ViewHolder(); converView = mInflater.inflate(R.layout.iten_layout,null); viewHolder.znImage = (ImageView) converView.findViewById(R.id.tv_icon); viewHolder.znTittle = (TextView) converView.findViewById(R.id.tv_tittle); viewHolder.znTittle2 = (TextView) converView.findViewById(R.id.tv_content); converView.setTag(viewHolder); }else{ viewHolder = (ViewHolder) converView.getTag(); } viewHolder.znImage.setImageResource(R.id.tv_icon); viewHolder.znTittle.setText(mList.get(position).getZntittle()); viewHolder.znTittle2.setText(mList.get(position).getZntittle2()); return converView; } class ViewHolder { public ImageView znImage; public TextView znTittle; public TextView znTittle2; } } ```
android PullToRefreshListView报错
我在项目中导入了PullToRefreshListView这个包,然后实现了上拉刷新和下拉刷新的 接口,我在模拟器中调试程序,发现下拉刷新刷几次就崩了,报错:java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but only from the UI thread. Make sure your adapter calls notifyDataSetChanged() when its content changes. [in ListView(16908298, class com.handmark.pulltorefresh.library.PullToRefreshListView$InternalListViewSDK9) with Adapter 网上说更新adpater要在UI线程里面进行。我是在UI线程里面进行的。我的整体思路是这样的:下拉刷新之后,在异步任务中下载数据,下载完成后用handler来告知主线程,在主线程中mAdapter.notifyDataSetChanged();然后pullToRefreshListView.onRefreshComplete(); 感觉没什么问题啊,而且我还加了判断,当下拉刷新正在执行的话就直接onRefreshComplete但是在模拟器上面,滑动几次就报上面的错误了。然后我又在真机上面测试,滑了很多次又没有报错,难道是模拟器的原因吗?如果是模拟器的原因的那还好,万一不是的,但是真机上现在现在不报错,到时候上线了报错怎么办?求大神告知解决办法 我的代码: public class ClubMemberActivity extends Activity { private TopBar topBar;//顶部导航栏 private List<ClubMembers>list = new ArrayList<>();//数据集合 private TextView textView;//刚进入页面时提示用户正在加载数据 private PullToRefreshListView pullToRefreshListView; private ClubMemberAdapter clubMemberAdapter;//Adapter private boolean isRefresh = false;//判断是否正在执行刷新 Handler handler = new Handler(){ /** * Subclasses must implement this to receive messages. * * @param msg */ @Override public void handleMessage(Message msg) { switch (msg.what){ case 0: //更新pullToRefreshListview clubMemberAdapter.list = list; clubMemberAdapter.notifyDataSetChanged(); pullToRefreshListView.onRefreshComplete(); isRefresh = false; break; case 1: textView.setVisibility(View.GONE);//数据加载完成后,设置此View为GONE clubMemberAdapter = new ClubMemberAdapter(list, ClubMemberActivity.this,false); pullToRefreshListView = (PullToRefreshListView) findViewById(R.id.id_lv_clubMM); pullToRefreshListView.setAdapter(clubMemberAdapter); pullToRefreshListView.setMode(PullToRefreshBase.Mode.BOTH); pullToRefreshListView.setOnRefreshListener(new PullToRefreshBase.OnRefreshListener2<ListView>() { @Override public void onPullDownToRefresh(PullToRefreshBase<ListView> refreshView) { if (!isRefresh){ isRefresh = true; new getDataTask().execute(1); }else{ pullToRefreshListView.onRefreshComplete(); } } @Override public void onPullUpToRefresh(PullToRefreshBase<ListView> refreshView) { if (!isRefresh){ isRefresh = true; new getDataTask().execute(0); }else{ pullToRefreshListView.onRefreshComplete(); } } }); break; } } }; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_clubmember); initView(); } //初始化一些控件 private void initView() { topBar = (TopBar) findViewById(R.id.id_topBar_clubMM); topBar.setOnTopBarClickListener(new TopBar.TopBarClickListener() { @Override public void OnClick_left() { finish(); } @Override public void OnClick_center() { } @Override public void OnClick_right() { } }); textView = (TextView) findViewById(R.id.id_txt_clubMM_loading); getData(); } /** * 字符串转换为图片(模拟下载图片,所以先将本地的图片转换成字符串,在Adapter中再将字符串转换成图片) * @param drawable * @return */ public synchronized String drawableToByte(Drawable drawable) { if (drawable != null) { Bitmap bitmap = Bitmap .createBitmap( drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight(), drawable.getOpacity() != PixelFormat.OPAQUE ? Bitmap.Config.ARGB_8888 : Bitmap.Config.RGB_565); Canvas canvas = new Canvas(bitmap); drawable.setBounds(0, 0, drawable.getIntrinsicWidth(), drawable.getIntrinsicHeight()); drawable.draw(canvas); int size = bitmap.getWidth() * bitmap.getHeight() * 4; // 创建一个字节数组输出流,流的大小为size ByteArrayOutputStream baos = new ByteArrayOutputStream(size); // 设置位图的压缩格式,质量为100%,并放入字节数组输出流中 bitmap.compress(Bitmap.CompressFormat.PNG, 100, baos); // 将字节数组输出流转化为字节数组byte[] byte[] imagedata = baos.toByteArray(); String icon= Base64.encodeToString(imagedata, Base64.DEFAULT); return icon; } return null; } @TargetApi(Build.VERSION_CODES.LOLLIPOP) public void getData(){ new Thread(){ @Override public void run() { /** * 测试用数据 */ for (int i = 0; i < 10; i++) { ClubMembers clubmm = new ClubMembers(); clubmm.clubMembID = i + ""; clubmm.name = "死神" + i; clubmm.photo = drawableToByte(getDrawable(R.drawable.head)); clubmm.playerID = "palyerID" + i; clubmm.worth = new Worth(); clubmm.worth.arena_worth = 100 + ""; clubmm.worth.arena_Name = "name" + i; list.add(clubmm); } handler.sendEmptyMessage(1); } }.start(); } private class getDataTask extends AsyncTask<Integer,Void,Integer>{ @Override protected Integer doInBackground(Integer... params) { //模拟下载数据 Log.e("infoo","开始异步操作"); if (params[0] == 1){ for (int i = 0;i<5;i++){ ClubMembers clubmm = new ClubMembers(); clubmm.clubMembID = i + "我是添加数据"; clubmm.name = "死神(我是添加的数据)" + i; clubmm.photo = drawableToByte(getDrawable(R.drawable.head)); clubmm.playerID = "palyerID" + i; clubmm.worth = new Worth(); clubmm.worth.arena_worth = 100 + ""; clubmm.worth.arena_Name = "name" + i; list.add(0,clubmm); } }else{ for (int i = 0;i<5;i++){ ClubMembers clubmm = new ClubMembers(); clubmm.clubMembID = i + "我是添加数据"; clubmm.name = "死神(我是添加的数据)" + i; clubmm.photo = drawableToByte(getDrawable(R.drawable.head)); clubmm.playerID = "palyerID" + i; clubmm.worth = new Worth(); clubmm.worth.arena_worth = 100 + ""; clubmm.worth.arena_Name = "name" + i; list.add(list.size(),clubmm); } } Log.e("infoo","size === "+list.size()); return null; } @Override protected void onPostExecute(Integer s) { super.onPostExecute(s); handler.sendEmptyMessage(0); } } }
android 关于bmob查询和baseadaper使用时的问题
这使用bomb 云端查询时出现的问题 final List<User_history> histories = new ArrayList<>(); BmobQuery<User_history> query = new BmobQuery<User_history>(); query.addWhereEqualTo("user_id", "c72a3ab1ce"); query.setLimit(10); query.findObjects(this, new FindListener<User_history>() { public void onSuccess(List<User_history> list) { System.out.println("ssssssssssssssssss"); for (User_history user_history : list) { User_history user_history1 = new User_history(); user_history1.setUser_id(user_history.getUser_id()); user_history1.setOrder_id(user_history.getOrder_id()); Log.e("TAG", user_history1.getOrder_id()); Log.e("TAG", "-------------------------"); histories.add(user_history1); } System.out.println("-------------------------" + histories.size()); } @Override public void onError(int i, String s) { Toast.makeText(History.this, "查询失败", Toast.LENGTH_SHORT).show(); } }); HistoryAdapter adapter = new HistoryAdapter(this, histories); listView.setAdapter(adapter); System.out.println("-------------------------" + histories.size()) } 我在查询时adapter最后加载histories时histories里时没有数据,于是通过加断点和输出的方式发现每次他每次都是让adapter首先加载无值的histories然后才进内部类进行查询操作和histories的add操作进行赋值,所以每次都没有数据,这算是异步操作吗 应该怎样解决
在中国程序员是青春饭吗?
今年,我也32了 ,为了不给大家误导,咨询了猎头、圈内好友,以及年过35岁的几位老程序员……舍了老脸去揭人家伤疤……希望能给大家以帮助,记得帮我点赞哦。 目录: 你以为的人生 一次又一次的伤害 猎头界的真相 如何应对互联网行业的「中年危机」 一、你以为的人生 刚入行时,拿着傲人的工资,想着好好干,以为我们的人生是这样的: 等真到了那一天,你会发现,你的人生很可能是这样的: ...
我在支付宝花了1分钟,查到了女朋友的开房记录!
在大数据时代下,不管你做什么都会留下蛛丝马迹,只要学会把各种软件运用到极致,捉奸简直轻而易举。今天就来给大家分享一下,什么叫大数据抓出轨。据史料证明,马爸爸年轻时曾被...
程序员请照顾好自己,周末病魔差点一套带走我。
程序员在一个周末的时间,得了重病,差点当场去世,还好及时挽救回来了。
卸载 x 雷某度!GitHub 标星 1.5w+,从此我只用这款全能高速下载工具!
作者 | Rocky0429 来源 | Python空间 大家好,我是 Rocky0429,一个喜欢在网上收集各种资源的蒟蒻… 网上资源眼花缭乱,下载的方式也同样千奇百怪,比如 BT 下载,磁力链接,网盘资源等等等等,下个资源可真不容易,不一样的方式要用不同的下载软件,因此某比较有名的 x 雷和某度网盘成了我经常使用的工具。 作为一个没有钱的穷鬼,某度网盘几十 kb 的下载速度让我...
20道你必须要背会的微服务面试题,面试一定会被问到
写在前面: 在学习springcloud之前大家一定要先了解下,常见的面试题有那块,然后我们带着问题去学习这个微服务技术,那么就会更加理解springcloud技术。如果你已经学了springcloud,那么在准备面试的时候,一定要看看看这些面试题。 文章目录1、什么是微服务?2、微服务之间是如何通讯的?3、springcloud 与dubbo有哪些区别?4、请谈谈对SpringBoot 和S...
为什么猝死的都是程序员,基本上不见产品经理猝死呢?
相信大家时不时听到程序员猝死的消息,但是基本上听不到产品经理猝死的消息,这是为什么呢? 我们先百度搜一下:程序员猝死,出现将近700多万条搜索结果: 搜索一下:产品经理猝死,只有400万条的搜索结果,从搜索结果数量上来看,程序员猝死的搜索结果就比产品经理猝死的搜索结果高了一倍,而且从下图可以看到,首页里面的五条搜索结果,其实只有两条才是符合条件。 所以程序员猝死的概率真的比产品经理大,并不是错...
毕业5年,我问遍了身边的大佬,总结了他们的学习方法
我问了身边10个大佬,总结了他们的学习方法,原来成功都是有迹可循的。
推荐10个堪称神器的学习网站
每天都会收到很多读者的私信,问我:“二哥,有什么推荐的学习网站吗?最近很浮躁,手头的一些网站都看烦了,想看看二哥这里有什么新鲜货。” 今天一早做了个恶梦,梦到被老板辞退了。虽然说在我们公司,只有我辞退老板的份,没有老板辞退我这一说,但是还是被吓得 4 点多都起来了。(主要是因为我掌握着公司所有的核心源码,哈哈哈) 既然 4 点多起来,就得好好利用起来。于是我就挑选了 10 个堪称神器的学习网站,推...
这些软件太强了,Windows必装!尤其程序员!
Windows可谓是大多数人的生产力工具,集娱乐办公于一体,虽然在程序员这个群体中都说苹果是信仰,但是大部分不都是从Windows过来的,而且现在依然有很多的程序员用Windows。 所以,今天我就把我私藏的Windows必装的软件分享给大家,如果有一个你没有用过甚至没有听过,那你就赚了????,这可都是提升你幸福感的高效率生产力工具哦! 走起!???? NO、1 ScreenToGif 屏幕,摄像头和白板...
阿里面试,面试官没想到一个ArrayList,我都能跟他扯半小时
我是真的没想到,面试官会这样问我ArrayList。
曾经优秀的人,怎么就突然不优秀了。
职场上有很多辛酸事,很多合伙人出局的故事,很多技术骨干被裁员的故事。说来模板都类似,曾经是名校毕业,曾经是优秀员工,曾经被领导表扬,曾经业绩突出,然而突然有一天,因为种种原因,被裁员了,...
大学四年因为知道了这32个网站,我成了别人眼中的大神!
依稀记得,毕业那天,我们导员发给我毕业证的时候对我说“你可是咱们系的风云人物啊”,哎呀,别提当时多开心啦????,嗯,我们导员是所有导员中最帅的一个,真的???? 不过,导员说的是实话,很多人都叫我大神的,为啥,因为我知道这32个网站啊,你说强不强????,这次是绝对的干货,看好啦,走起来! PS:每个网站都是学计算机混互联网必须知道的,真的牛杯,我就不过多介绍了,大家自行探索,觉得没用的,尽管留言吐槽吧???? 社...
良心推荐,我珍藏的一些Chrome插件
上次搬家的时候,发了一个朋友圈,附带的照片中不小心暴露了自己的 Chrome 浏览器插件之多,于是就有小伙伴评论说分享一下我觉得还不错的浏览器插件。 我下面就把我日常工作和学习中经常用到的一些 Chrome 浏览器插件分享给大家,随便一个都能提高你的“生活品质”和工作效率。 Markdown Here Markdown Here 可以让你更愉快的写邮件,由于支持 Markdown 直接转电子邮...
看完这篇HTTP,跟面试官扯皮就没问题了
我是一名程序员,我的主要编程语言是 Java,我更是一名 Web 开发人员,所以我必须要了解 HTTP,所以本篇文章就来带你从 HTTP 入门到进阶,看完让你有一种恍然大悟、醍醐灌顶的感觉。 最初在有网络之前,我们的电脑都是单机的,单机系统是孤立的,我还记得 05 年前那会儿家里有个电脑,想打电脑游戏还得两个人在一个电脑上玩儿,及其不方便。我就想为什么家里人不让上网,我的同学 xxx 家里有网,每...
2020 年,大火的 Python 和 JavaScript 是否会被取而代之?
Python 和 JavaScript 是目前最火的两大编程语言,但是2020 年,什么编程语言将会取而代之呢? 作者 |Richard Kenneth Eng 译者 |明明如月,责编 | 郭芮 出品 | CSDN(ID:CSDNnews) 以下为译文: Python 和 JavaScript 是目前最火的两大编程语言。然而,他们不可能永远屹立不倒。最终,必将像其他编程语言一...
史上最全的IDEA快捷键总结
现在Idea成了主流开发工具,这篇博客对其使用的快捷键做了总结,希望对大家的开发工作有所帮助。
阿里程序员写了一个新手都写不出的低级bug,被骂惨了。
这种新手都不会范的错,居然被一个工作好几年的小伙子写出来,差点被当场开除了。
谁是华为扫地僧?
是的,华为也有扫地僧!2020年2月11-12日,“养在深闺人不知”的华为2012实验室扫地僧们,将在华为开发者大会2020(Cloud)上,和大家见面。到时,你可以和扫地僧们,吃一个洋...
AI 没让人类失业,搞 AI 的人先失业了
最近和几个 AI 领域的大佬闲聊 根据他们讲的消息和段子 改编出下面这个故事 如有雷同 都是巧合 1. 老王创业失败,被限制高消费 “这里写我跑路的消息实在太夸张了。” 王葱葱哼笑一下,把消息分享给群里。 阿杰也看了消息,笑了笑。在座几位也都笑了。 王葱葱是个有名的人物,21岁那年以全额奖学金进入 KMU 攻读人工智能博士,累计发表论文 40 余篇,个人技术博客更是成为深度学习领域内风向标。 ...
2020年,冯唐49岁:我给20、30岁IT职场年轻人的建议
点击“技术领导力”关注∆每天早上8:30推送 作者|Mr.K 编辑| Emma 来源|技术领导力(ID:jishulingdaoli) 前天的推文《冯唐:职场人35岁以后,方法论比经验重要》,收到了不少读者的反馈,觉得挺受启发。其实,冯唐写了不少关于职场方面的文章,都挺不错的。可惜大家只记住了“春风十里不如你”、“如何避免成为油腻腻的中年人”等不那么正经的文章。 本文整理了冯...
最全最强!世界大学计算机专业排名总结!
我正在参与CSDN200进20,希望得到您的支持,扫码续投票5次。感谢您! (为表示感谢,您投票后私信我,我把我总结的人工智能手推笔记和思维导图发送给您,感谢!) 目录 泰晤士高等教育世界大学排名 QS 世界大学排名 US News 世界大学排名 世界大学学术排名(Academic Ranking of World Universities) 泰晤士高等教育世界大学排名 中国共...
作为一名大学生,如何在B站上快乐的学习?
B站是个宝,谁用谁知道???? 作为一名大学生,你必须掌握的一项能力就是自学能力,很多看起来很牛X的人,你可以了解下,人家私底下一定是花大量的时间自学的,你可能会说,我也想学习啊,可是嘞,该学习啥嘞,不怕告诉你,互联网时代,最不缺的就是学习资源,最宝贵的是啥? 你可能会说是时间,不,不是时间,而是你的注意力,懂了吧! 那么,你说学习资源多,我咋不知道,那今天我就告诉你一个你必须知道的学习的地方,人称...
那些年,我们信了课本里的那些鬼话
教材永远都是有错误的,从小学到大学,我们不断的学习了很多错误知识。 斑羚飞渡 在我们学习的很多小学课文里,有很多是错误文章,或者说是假课文。像《斑羚飞渡》: 随着镰刀头羊的那声吼叫,整个斑羚群迅速分成两拨,老年斑羚为一拨,年轻斑羚为一拨。 就在这时,我看见,从那拨老斑羚里走出一只公斑羚来。公斑羚朝那拨年轻斑羚示意性地咩了一声,一只半大的斑羚应声走了出来。一老一少走到伤心崖,后退了几步,突...
使用 Python 和百度语音识别生成视频字幕
文章目录从视频中提取音频根据静音对音频分段使用百度语音识别获取 Access Token使用 Raw 数据进行合成生成字幕总结 从视频中提取音频 安装 moviepy pip install moviepy 相关代码: audio_file = work_path + '\\out.wav' video = VideoFileClip(video_file) video.audio.write_...
一个程序在计算机中是如何运行的?超级干货!!!
强烈声明:本文很干,请自备茶水!???? 开门见山,咱不说废话! 你有没有想过,你写的程序,是如何在计算机中运行的吗?比如我们搞Java的,肯定写过这段代码 public class HelloWorld { public static void main(String[] args) { System.out.println("Hello World!"); } ...
【蘑菇街技术部年会】程序员与女神共舞,鼻血再次没止住。(文末内推)
蘑菇街技术部的年会,别开生面,一样全是美女。
那个在阿里养猪的工程师,5年了……
简介: 在阿里,走过1825天,没有趴下,依旧斗志满满,被称为“五年陈”。他们会被授予一枚戒指,过程就叫做“授戒仪式”。今天,咱们听听阿里的那些“五年陈”们的故事。 下一个五年,猪圈见! 我就是那个在养猪场里敲代码的工程师,一年多前我和20位工程师去了四川的猪场,出发前总架构师慷慨激昂的说:同学们,中国的养猪产业将因为我们而改变。但到了猪场,发现根本不是那么回事:要个WIFI,没有;...
为什么程序猿都不愿意去外包?
分享外包的组织架构,盈利模式,亲身经历,以及根据一些外包朋友的反馈,写了这篇文章 ,希望对正在找工作的老铁有所帮助
Java校招入职华为,半年后我跑路了
何来 我,一个双非本科弟弟,有幸在 19 届的秋招中得到前东家华为(以下简称 hw)的赏识,当时秋招签订就业协议,说是入了某 java bg,之后一系列组织架构调整原因等等让人无法理解的神操作,最终毕业前夕,被通知调往其他 bg 做嵌入式开发(纯 C 语言)。 由于已至于校招末尾,之前拿到的其他 offer 又无法再收回,一时感到无力回天,只得默默接受。 毕业后,直接入职开始了嵌入式苦旅,由于从未...
世界上有哪些代码量很少,但很牛逼很经典的算法或项目案例?
点击上方蓝字设为星标下面开始今天的学习~今天分享四个代码量很少,但很牛逼很经典的算法或项目案例。1、no code 项目地址:https://github.com/kelseyhight...
Python全栈 Linux基础之3.Linux常用命令
Linux对文件(包括目录)有很多常用命令,可以加快开发效率:ls是列出当前目录下的文件列表,选项有-a、-l、-h,还可以使用通配符;c功能是跳转目录,可以使用相对路径和绝对路径;mkdir命令创建一个新的目录,有-p选项,rm删除文件或目录,有-f、-r选项;cp用于复制文件,有-i、-r选项,tree命令可以将目录结构显示出来(树状显示),有-d选项,mv用来移动文件/目录,有-i选项;cat查看文件内容,more分屏显示文件内容,grep搜索内容;>、>>将执行结果重定向到一个文件;|用于管道输出。
​两年前不知如何编写代码的我,现在是一名人工智能工程师
全文共3526字,预计学习时长11分钟 图源:Unsplash 经常有小伙伴私信给小芯,我没有编程基础,不会写代码,如何进入AI行业呢?还能赶上AI浪潮吗? 任何时候努力都不算晚。 下面,小芯就给大家讲一个朋友的真实故事,希望能给那些处于迷茫与徘徊中的小伙伴们一丝启发。(下文以第一人称叙述) 图源:Unsplash 正如Elsa所说,职业转换是...
强烈推荐10本程序员必读的书
很遗憾,这个春节注定是刻骨铭心的,新型冠状病毒让每个人的神经都是紧绷的。那些处在武汉的白衣天使们,尤其值得我们的尊敬。而我们这些窝在家里的程序员,能不外出就不外出,就是对社会做出的最大的贡献。 有些读者私下问我,窝了几天,有点颓丧,能否推荐几本书在家里看看。我花了一天的时间,挑选了 10 本我最喜欢的书,你可以挑选感兴趣的来读一读。读书不仅可以平复恐惧的压力,还可以对未来充满希望,毕竟苦难终将会...
Python实战:抓肺炎疫情实时数据,画2019-nCoV疫情地图
今天,群里白垩老师问如何用python画武汉肺炎疫情地图。白垩老师是研究海洋生态与地球生物的学者,国家重点实验室成员,于不惑之年学习python,实为我等学习楷模。先前我并没有关注武汉肺炎的具体数据,也没有画过类似的数据分布图。于是就拿了两个小时,专门研究了一下,遂成此文。
非典逼出了淘宝和京东,新冠病毒能够逼出什么?
loonggg读完需要5分钟速读仅需 2 分钟大家好,我是你们的校长。我知道大家在家里都憋坏了,大家可能相对于封闭在家里“坐月子”,更希望能够早日上班。今天我带着大家换个思路来聊一个问题...
牛逼!一行代码居然能解决这么多曾经困扰我半天的算法题
春节假期这么长,干啥最好?当然是折腾一些算法题了,下面给大家讲几道一行代码就能解决的算法题,当然,我相信这些算法题你都做过,不过就算做过,也是可以看一看滴,毕竟,你当初大概率不是一行代码解决的。 学会了一行代码解决,以后遇到面试官问起的话,就可以装逼了。 一、2 的幂次方 问题描述:判断一个整数 n 是否为 2 的幂次方 对于这道题,常规操作是不断这把这个数除以 2,然后判断是否有余数,直到 ...
立即提问