2016-07-07 71 views
0

当从列表视图中的网络图像视图传递一个位图到一个片段时,我收到了一些奇怪的行为。从列表视图适配器传递位图到片段奇怪的行为

我从列表视图适配器中的URL加载图像,然后当点击列表视图项时,来自该列表视图的图像被用作片段中的背景。但是,当我这样做时,在片段中显示错误的图像,所显示的图像是当前在屏幕上可见的列表视图底部的项目。

这里是我的适配器设置列表视图:

public class EventListAdapter extends BaseAdapter { 

Context context; 
public static ArrayList<EventObject> eventList; 
private LayoutInflater mInflater; 
private Bitmap bitmap; 
private NetworkImageView img_main; 
private RelativeLayout layoutItem; 
private TextView txt_event_name; 
private TextView txt_event_details; 

public EventListAdapter(Context context, ArrayList<EventObject> eventList) { 
    this.context = context; 
    this.eventList = eventList; 
    mInflater = LayoutInflater.from(context); 
} 


public void addItems(ArrayList<EventObject> eventList) { 
    this.eventList.addAll(eventList); 
    notifyDataSetChanged(); 
} 

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

@Override 
public Object getItem(int position) { 
    return eventList.get(position); 
} 

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

@SuppressLint("all") 
@Override 
public View getView(final int position, View convertView, ViewGroup parent) { 
    try { 
     // reuse of convertView 
     if (convertView == null) { 
      layoutItem = (RelativeLayout) mInflater.inflate(R.layout.view_event_list_item, parent, false); 
     } else { 
      layoutItem = (RelativeLayout) convertView; 
     } 

     img_main = (NetworkImageView) layoutItem.findViewById(R.id.img_main); 
     txt_event_details = (TextView) layoutItem.findViewById(R.id.txt_event_details); 
     txt_event_name = (TextView) layoutItem.findViewById(R.id.txt_event_name); 

     txt_event_name.setTypeface(FontClass.getOpenSansRegular(context)); 
     txt_event_details.setTypeface(FontClass.getOpenSansLight(context)); 

     img_main.setDefaultImageResId(R.drawable.ic_weekends_matter_black); 
     img_main.setImageUrl(eventList.get(position).getImageUrl(), new ImageLoader(NetworkManager.getInstance().requestQueue, new LruBitmapCache())); 

     txt_event_name.setText(eventList.get(position).getEventName()); 
     txt_event_details.setText(eventList.get(position).getVenueName() + ", " + getFormattedDate(eventList.get(position).getEventDate())); 

     layoutItem.setOnClickListener(new View.OnClickListener() { 
      @Override 
      public void onClick(View v) { 
       ((HomeActivity) context).setEventProfileFrag(eventList.get(position).getFullJsonObject(), ((BitmapDrawable)img_main.getDrawable()).getBitmap()); 
      } 
     }); 

    } catch (Exception e) { 
     e.printStackTrace(); 
    } 

    notifyDataSetChanged(); 
    return layoutItem; 
} 

private String getFormattedDate(String dateString) throws ParseException { 

    //"2016-06-27 16:00:00" 
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.UK); 
    Date newDate = format.parse(dateString); 

    format = new SimpleDateFormat("EEEE dd MMMM", Locale.UK); 
    String date = format.format(newDate); 

    return date; 
} 
} 

然后终于在片段我检索到的片段传递参数图片:

mParam2 = BitmapFactory.decodeByteArray(getArguments().getByteArray(ARG_PARAM2), 0, getArguments().getByteArray(ARG_PARAM2).length); 

img_header.setImageBitmap(mParam2); 
+0

显示您的适配器类。 – Drv

+0

@Drv添加了它.. – MichaelStoddart

回答

1

下面替换您的适配器类,它可能工作:

public class EventListAdapter extends BaseAdapter { 

     Context context; 
     public static ArrayList<EventObject> eventList; 
     private LayoutInflater mInflater; 
     private Bitmap bitmap; 
     private NetworkImageView img_main; 

     class ViewHolder{ 

     private RelativeLayout layoutItem; 
     private TextView txt_event_name; 
     private TextView txt_event_details; 
     } 

     public EventListAdapter(Context context, ArrayList<EventObject> eventList) { 
     this.context = context; 
      this.eventList = eventList; 
      mInflater = LayoutInflater.from(context); 
     } 


     public void addItems(ArrayList<EventObject> eventList) { 
this.eventList.addAll(eventList); 
notifyDataSetChanged(); 
} 

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

     @Override 
    public Object getItem(int position) { 
return eventList.get(position); 
} 

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

    @SuppressLint("all") 
    @Override 
    public View getView(final int position, View convertView, ViewGroup parent) { 
try { 
    // reuse of convertView 
    ViewHolder holder; 
      if (convertView == null) { 
      holder=new ViewHolder(); 
      holder.layoutItem = (RelativeLayout) mInflater.inflate(R.layout.view_event_list_item, parent, false); 
    } else { 
     holder.layoutItem = (RelativeLayout) convertView; 
    } 

    holder.img_main = (NetworkImageView) layoutItem.findViewById(R.id.img_main); 
    holder.txt_event_details = (TextView) layoutItem.findViewById(R.id.txt_event_details); 
    holder.txt_event_name = (TextView) layoutItem.findViewById(R.id.txt_event_name); 

    holder.txt_event_name.setTypeface(FontClass.getOpenSansRegular(context)); 
    txt_event_details.setTypeface(FontClass.getOpenSansLight(context)); 

     holder.img_main.setDefaultImageResId(R.drawable.ic_weekends_matter_black); 
    holder.img_main.setImageUrl(eventList.get(position).getImageUrl(), new ImageLoader(NetworkManager.getInstance().requestQueue, new LruBitmapCache())); 

    holder.txt_event_name.setText(eventList.get(position).getEventName()); 
    holder.txt_event_details.setText(eventList.get(position).getVenueName() + ", " + getFormattedDate(eventList.get(position).getEventDate())); 

    holder.layoutItem.setOnClickListener(new View.OnClickListener() { 
     @Override 
     public void onClick(View v) { 
      ((HomeActivity) context).setEventProfileFrag(eventList.get(holder.getPosition()).getFullJsonObject(), ((BitmapDrawable)img_main.getDrawable()).getBitmap()); 
     } 
    }); 

} catch (Exception e) { 
    e.printStackTrace(); 
} 

notifyDataSetChanged(); 
return layoutItem; 
} 

private String getFormattedDate(String dateString) throws ParseException { 

//"2016-06-27 16:00:00" 
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.UK); 
Date newDate = format.parse(dateString); 

format = new SimpleDateFormat("EEEE dd MMMM", Locale.UK); 
String date = format.format(newDate); 

return date; 
} 
} 
+0

它花了一些重构来让它工作,但它的作用像一个魅力,谢谢! – MichaelStoddart