2014-04-07 133 views
0

我已经实现了一个ListView加载新闻,但是当我滚动列表时新闻更改位置。这是清单ListView项目更改滚动位置

public class ListNewsFragment extends SherlockListFragment{ 

private ListNewsAdapter mAdapter; 

@Override 
public void onCreate(Bundle savedInstanceState) { 
    mAdapter = new ListNewsAdapter(this, app.getAllNews()); 
    setListAdapter(mAdapter); 
    super.onCreate(savedInstanceState); 
} 
} 


public class ListNewsAdapter extends BaseAdapter{ 
private List<News> news; 
private Context mContext; 
private LayoutInflater inflater; 
private ViewHolder holder; 

public ListNewsAdapter(final Fragment c, List<News> news) { 
    super(); 
    this.news = news; 
    this.mContext = c.getActivity(); 
    inflater = LayoutInflater.from(mContext); 
} 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    View v = convertView; 
    if (v == null) {    
     inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);   
     holder = new ViewHolder(); 
     v = inflater.inflate(R.layout.fragment_list_news, null); 

     holder.name = (TextView) v.findViewById(R.id.tittle); 
     holder.tweet = (TextView) v.findViewById(R.id.news); 
     holder.avatar = (ImageView) v.findViewById(R.id.image); 


     holder.name.setText(news.get(position).getTitulo()); 
     holder.tweet.setText(news.get(position).getCopete()); 
     new ImagefetcherTask(position).execute(holder); 

     v.setTag(holder); 
    } else {    
    holder = (ViewHolder) convertView.getTag();   
    }        
    return v; 

} 

private class ViewHolder{ 
    public TextView name, tweet; 
    public ImageView avatar; 
} 

private class ImagefetcherTask extends AsyncTask<ViewHolder, Void, ViewHolder> { 

     private Bitmap bitmap; 
     int position; 

     public ImagefetcherTask(int position) { 
      this.position = position; 
     } 

     @Override 
     protected ViewHolder doInBackground(ViewHolder... params) { 
      ViewHolder viewHolder = params[0]; 

      try{ 
       bitmap = BitmapFactory.decodeStream((InputStream) new URL("...."+ news.get(position).getImagen().toString()).getContent()); 
      } catch (MalformedURLException e) { 
       e.printStackTrace(); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 

      return viewHolder; 
     } 

    @Override 
    protected void onPostExecute(ViewHolder result) { 
     // TODO Auto-generated method stub 
     if (bitmap == null) { 
      result.avatar.setImageResource(com.dev.suma_intranet_v1.R.drawable.img_perfil); 
     } else { 
      result.avatar.setImageBitmap(bitmap); 
     } 
    } 

} 

}

+5

只设置文本的TextView当画面为空,更好地利用延迟加载加载图像。也缓存他们,所以你不必下载evertime – Raghunandan

+0

@Raghunandan我应该怎么做? –

+0

在getView方法中的else语句后移动设置为文本代码 –

回答

8

将您的getView()方法更改为:

Map<Integer, View> views = new HashMap<Integer, View>; 

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 

    if (views.containsKey(position)) {  
     return views.get(position); 
    } 

    inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE);   
    holder = new ViewHolder(); 
    View v = inflater.inflate(R.layout.fragment_list_news, null); 

    holder.name = (TextView) v.findViewById(R.id.tittle); 
    holder.tweet = (TextView) v.findViewById(R.id.news); 
    holder.avatar = (ImageView) v.findViewById(R.id.image); 

    holder.name.setText(news.get(position).getTitulo()); 
    holder.tweet.setText(news.get(position).getCopete()); 
    new ImagefetcherTask(position).execute(holder); 

    v.setTag(holder); 
    views.put(position, v); 
    return v; 

} 
+0

如果我这样做,图像不断变化 –

+0

这是因为你的'ImagefotherTask'。你可以添加代码吗?我的猜测是它在滚动并重新使用'View'后更新图像。如果列表中的项目数量有限,则可以停止重复使用“视图”,并且它应该可以解决问题。您可能需要考虑将所有'View'存储在'List'中。 – Tautvydas

+0

这就是我所有的代码,是的,我有30个项目,我该如何停止重用视图? –

1

打电话给你的ImageFetcherTextView.seTextelse后声明,以便当convertViewnull并已回收,您更新了一行:

@Override 
public View getView(int position, View convertView, ViewGroup parent) { 
    View v = convertView; 
    if (v == null) { 
     inflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
     holder = new ViewHolder(); 
     v = inflater.inflate(R.layout.fragment_list_news, null); 

     holder.name = (TextView) v.findViewById(R.id.tittle); 
     holder.tweet = (TextView) v.findViewById(R.id.news); 
     holder.avatar = (ImageView) v.findViewById(R.id.image); 

     v.setTag(holder); 
    } else { 
     holder = (ViewHolder) convertView.getTag(); 
    } 
    holder.name.setText(news.get(position).getTitulo()); 
    holder.tweet.setText(news.get(position).getCopete()); 
    new ImagefetcherTask(position).execute(holder); 
    return v; 
} 
+0

也请写一些解释,以便他更好地理解'TableView'中'Views'的回收/可重用性 –

+0

@adneal如果我这样做,图像不断变化 –

+0

@IgnacioGarat这可能与你的ImageFetcher有关。 – adneal

0

尝试通过使用this通用图像加载器库来执行延迟加载图像。并尝试捕捉图像。

使每this答案设置位图选项

DisplayImageOptions options = new DisplayImageOptions.Builder() 
         .showImageOnLoading(R.drawable.ic_stub) 
         .showImageForEmptyUri(R.drawable.ic_empty) 
         .showImageOnFail(R.drawable.ic_error) 
         .cacheInMemory(true) 
         .cacheOnDisc(true) 
         .considerExifParams(true) 
         .build(); 

我相信这将解决你的问题