2014-05-21 42 views
0

我正在开发一个应用程序,它将从服务器服务获取最新消息,然后显示在列表视图中。代码如下:在同一时间下载多个图像,并更新列表视图

HomeFragment.java 

@SuppressLint("NewApi") 
public class HomeFragment extends Fragment { 
    private ListView listView; 
    EditText search; 
    ImageButton btn; 
    ProgressDialog mProgressDialog; 
    private NewsHomeAdapter customNewsHomeAdapter; 

    Context homeFragmentContext; 

    final ArrayList<NewsItem> news_home_data = new ArrayList<NewsItem>(); 

    // child categories JSONArray 
    JSONArray newsItems = null; 

    public HomeFragment(){} 

    @Override 
    public View onCreateView(LayoutInflater inflater, final ViewGroup container, 
      Bundle savedInstanceState) { 

     View rootView = inflater.inflate(R.layout.fragment_home, container, false); 

     homeFragmentContext = container.getContext(); 
     listView = (ListView) rootView.findViewById(R.id.news_home_list); 
     search = (EditText) rootView.findViewById(R.id.search); 
     search.setOnKeyListener(new OnKeyListener() { 
      public boolean onKey(View v, int keyCode, KeyEvent event) { 
       if ((event.getAction() == KeyEvent.ACTION_DOWN) 
         && (keyCode == KeyEvent.KEYCODE_ENTER)) { 

        String query_text = search.getText().toString().trim(); 

        try { 
         query_text = URLEncoder.encode(query_text, "utf-8"); 
        } catch (UnsupportedEncodingException e) { 

        } 
        String full_query = query_text; 

        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(search.getWindowToken(), 0); 

        Intent bussiness = new Intent(homeFragmentContext, 
          SearchNews.class); 
        Bundle basket_buss_category = new Bundle(); 

        basket_buss_category.putString("SEARCH", full_query); 
        ; 

        bussiness.putExtras(basket_buss_category); 

        startActivity(bussiness); 

        return true; 
       } 
       return false; 
      } 


     }); 

     new GetNewsData().execute(TimeUtils.NEWS_HOME_URL); 

     listView.setOnItemClickListener(new OnItemClickListener() { 

      public void onItemClick(AdapterView<?> a, View v, int position, 
        long id) { 

       Intent cluster = new Intent(homeFragmentContext, NewsCluster.class); 

       Bundle newslist = new Bundle(); 
       newslist.putString("NLIST",news_home_data.get(position).getCluster()); 
       cluster.putExtras(newslist); 
       startActivity(cluster); 


      } 

     }); 

     btn = (ImageButton) rootView.findViewById(R.id.search_button); 
     btn.setOnClickListener(new OnClickListener() { 

      @Override 
      public void onClick(View arg0) { 

       String query_text = search.getText().toString().trim(); 
       if (query_text.equalsIgnoreCase("")) { 

        search.requestFocus(); 
        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(search.getWindowToken(), 0); 
       } 

       else { 

        try { 
         query_text = URLEncoder.encode(query_text, "utf-8"); 
        } catch (UnsupportedEncodingException e) { 
         e.printStackTrace(); 
        } 
        String full_query = query_text; 

        InputMethodManager imm = (InputMethodManager) getActivity().getSystemService(Context.INPUT_METHOD_SERVICE); 
        imm.hideSoftInputFromWindow(search.getWindowToken(), 0); 

        Intent bussiness = new Intent(homeFragmentContext, SearchNews.class); 
        Bundle basket_buss_category = new Bundle(); 

        basket_buss_category.putString("SEARCH", full_query); 

        bussiness.putExtras(basket_buss_category); 

        startActivity(bussiness); 

       } 

      } 
     }); 

     return rootView; 
    } 

    private class GetNewsData extends 
    AsyncTask<String, Void, ArrayList<NewsItem>> { 

protected void onPreExecute() { 
    super.onPreExecute(); 

    // shfaq Progress Dialogun, deri ne momentin qe te loadohen te 
    // dheant 
    mProgressDialog = new ProgressDialog(homeFragmentContext); 
    mProgressDialog.setMessage("Loading..."); 
    mProgressDialog.setIndeterminate(false); 
    mProgressDialog.show(); 
} 

@Override 
protected ArrayList<NewsItem> doInBackground(String... URL) { 

    String categories_url = URL[0]; 
    // Creating JSON Parser instance 
    JSONParser jParser = new JSONParser(); 
    // getting JSON string from URL 
    newsItems = jParser.getJSONFromUrl(categories_url); 
    Log.e("lsbsfbsfdbsfd", newsItems.toString()); 
    try { 
     for (int i = 0; i < newsItems.length(); i++) { 

      JSONObject c = newsItems.getJSONObject(i); 

      Log.e("po fillo procesimin e ", String.valueOf(i)); 
      String tittle = c.getString(TimeUtils.TAG_TITLE); 
      String desc = c.getString(TimeUtils.TAG_DESC); 
      String source = c.getString(TimeUtils.TAG_SOURCE); 
      String id = c.getString(TimeUtils.TAG_ID); 
      String link = c.getString(TimeUtils.TAG_LINK); 
      String published_time = c.getString(TimeUtils.TAG_PUB_TIME); 
      String image_url = c.getString(TimeUtils.TAG_IMAGE_URL); 
      String newsList = c.getString(TimeUtils.TAG_CLUSTER); 
      // download the image; 
      Bitmap bitmap = null; 


      try { // Download Image from URL 
       InputStream input = new 
       java.net.URL(image_url) .openStream(); // Decode Bitmap 

       bitmap = BitmapFactory.decodeStream(input); } catch 
       (Exception e) { 

       } 


      news_home_data.add(new NewsItem(tittle, desc, source, id, 
        link, published_time, bitmap,newsList)); 
     } 
    } catch (JSONException e) { 
     e.printStackTrace(); 
    } 
    return news_home_data; 
} 

@SuppressLint("ResourceAsColor") 
@Override 
protected void onPostExecute(ArrayList<NewsItem> news_home_data) { 
    customNewsHomeAdapter = new NewsHomeAdapter(homeFragmentContext, 
      news_home_data); 
    listView.setAdapter(customNewsHomeAdapter); 
    // setting the nav drawer list adapter 
    mProgressDialog.dismiss(); 
} 
} 

该适配器如下所示。

NesHomeAdapter.java 

package com.dev.apk.time.al; 

public class NewsHomeAdapter extends BaseAdapter{ 

    private ArrayList<NewsItem> news_data; 

    private LayoutInflater layoutInflater; 

    public NewsHomeAdapter(Context context, ArrayList<NewsItem> news_data) { 
     this.news_data = news_data; 
     layoutInflater = LayoutInflater.from(context); 
    } 

    public int getCount() { 
     return news_data.size(); 
    } 

    public Object getItem(int position) { 
     return news_data.get(position); 
    } 

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

    public View getView(int position, View convertView, ViewGroup parent) { 
     ViewHolder holder; 
     if (convertView == null) { 
      convertView = layoutInflater.inflate(R.layout.news_home_row, null); 
      holder = new ViewHolder(); 
      holder.tittle = (TextView) convertView.findViewById(R.id.tittle); 
      holder.source = (TextView) convertView.findViewById(R.id.source); 
      holder.published_time = (TextView) convertView.findViewById(R.id.published_time); 
      holder.news_image = (ImageView) convertView.findViewById(R.id.news_image); 
      convertView.setTag(holder); 
     } else { 
      holder = (ViewHolder) convertView.getTag(); 
     } 

     holder.tittle.setText(((NewsItem) news_data.get(position)).getTittle()); 
     holder.source.setText(((NewsItem) news_data.get(position)).getSource()); 
     holder.published_time.setText(((NewsItem) news_data.get(position)).getPublishedTime()); 
     holder.news_image.setImageBitmap(((NewsItem) news_data.get(position)).getImage()); 


     return convertView; 
    } 

    static class ViewHolder { 
     ImageView news_image; 
     TextView tittle; 
     TextView source; 
     TextView published_time; 

    }  
} 

正如你我有一个自定义列表视图。对于每一行我都有一个图像,它是基于来自JSON的URL下载的。但是我第一次至少有40条新闻,这意味着40张图片。显示新闻需要太多时间。

任何人都可以帮助我如何在同一时间下载图像,然后更新listView,还是有办法显示新闻,标题,说明等,并在以后更新图像?

+0

尝试使用AndroidQuery为,看到这里https://code.google.com/p/android-query/ –

回答

0

使用这个库UrlImageViewHelper

通过调用

UrlImageViewHelper.setUrlDrawable(yourImageView, "http://example.com/image.png", R.drawable.your_loading_image); 
在适配器


它会首先创建列表,后来下载图像,当图像被下载,它会显示your_loading_image,和下载的图像将被显示不久

编辑:
准确地说,通过YOUT的getImage返回的图片()函数中的类NewsI TEM应该是一个字符串URL到你的形象,并替换该行

holder.news_image.setImageBitmap(((NewsItem) news_data.get(position)).getImage()); 

UrlImageViewHelper.setUrlDrawable(holder.news_image, news_data.get(position).getImage(), R.drawable.your_loading_image); 


我已经遇到过这个问题,并UrlImageViewHelper是解决这一最简单的方法,只需导入库并使用一行就可以得到你想要的内容,不需要使用AsyncTask加载图像来自定义自己的AsyncTask

+0

它给了我一个错误:java.lang.NoClassDefFoundError。这与我导入它的方式或图书馆本身有关。 – Xhulio

+0

@xhulio koush已经为UrlImageViewHelper提供了一个jar库文件(查看github链接中的描述,你会发现jar下载链接),你只需要在你的项目构建路径中添加jar – ffyeahh

0

我推荐你使用AsyncTask在Android中。请看http://developer.android.com/reference/android/os/AsyncTask.html

这将帮助您在后台运行并将您的进度或下载的图像发布到imageview上。

new AsyncTask<String,Void,Void>(){ 
@Override 
protected Void doInBackground(String...arg){ 
    //download the image against the url, and run in the background as not on UI thread. 
} 

@Override 
protected void onPostExecute(Void v){ 
    //Load the imageview with the downloaded image. 
} 

}.execute(url1,url2,url3); 
相关问题