I have a listview(chat). And i get some strange behavior. It happens when i scroll up, then some items start to mess up, and when i go back at the bottom, the items are messed up too. The only thing i could figure out is that my getView is called a couple times at every scroll. Does anyone know how can i solve this issue?
i saw this post: Custom ListView adapter, strange ImageView behavior but there he does not add items to the list after it has been created.
<?xml version="1.0" encoding="utf-8"?>
<TextView
android:id="@+id/right_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/right_profilePic"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="20dp"
android:autoLink="all"
/>
<ImageView
android:id="@+id/left_profilePic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentLeft="true"
/>
<TextView
android:id="@+id/left_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/left_profilePic"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="20dp"
android:autoLink="all"
/>
<ImageView
android:id="@+id/right_profilePic"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_alignParentRight="true"
/>
<TextView
android:id="@+id/left_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginLeft="70dp"
android:layout_toRightOf="@+id/left_profilePic"
android:textColor="@color/Gray"
/>
<TextView
android:id="@+id/right_time"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentTop="true"
android:layout_marginRight="70dp"
android:layout_toLeftOf="@+id/right_profilePic"
android:textColor="@color/Gray"
/>
<ImageView
android:id="@+id/left_image_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toRightOf="@+id/left_profilePic"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="20dp"
/>
<ImageView
android:id="@+id/right_image_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:layout_alignParentBottom="true"
android:layout_toLeftOf="@+id/right_profilePic"
android:layout_marginLeft="5dp"
android:layout_marginRight="5dp"
android:layout_marginTop="20dp"
/>
Update
I have to load images and google static map inside chat, and i suppose this is heavy for a listview.
here is the getView method:
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.d("getView", "getview called");
ViewHolder holder;
if(convertView==null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.chat_item, null);
holder.right_profilePic = (ImageView) convertView.findViewById(R.id.right_profilePic);
holder.right_message = (TextView) convertView.findViewById(R.id.right_message);
holder.left_profilePic = (ImageView) convertView.findViewById(R.id.left_profilePic);
holder.left_message = (TextView) convertView.findViewById(R.id.left_message);
holder.right_time = (TextView) convertView.findViewById(R.id.right_time);
holder.left_time = (TextView) convertView.findViewById(R.id.left_time);
holder.right_image_message = (ImageView) convertView.findViewById(R.id.right_image_message);
holder.left_image_message = (ImageView) convertView.findViewById(R.id.left_image_message);
convertView.setTag(holder);
}
else
holder=(ViewHolder)convertView.getTag();
ChatItemBean bean = (ChatItemBean) chatItemList.get(position);
Log.d("holder", bean.getId() + " | " + GlobalData.myId);
if (bean.getId().equals(GlobalData.myId)) {
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.right_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
//holder.right_image_message.setPadding(0, 0, 0, 20);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
} else {
holder.right_message.setText(bean.getMessage());
holder.right_message.setBackgroundResource(R.drawable.chat_background_right);
}
holder.right_time.setText(bean.getTime());
} else {
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.left_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
holder.left_image_message.setPadding(0, 10, 0, 30);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
} else {
holder.left_message.setText(bean.getMessage());
holder.left_message.setBackgroundResource(R.drawable.chat_background_left);
}
holder.left_time.setText(bean.getTime());
}
return convertView;
}public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.d("getView", "getview called");
ViewHolder holder;
if(convertView==null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.chat_item, null);
holder.right_profilePic = (ImageView) convertView.findViewById(R.id.right_profilePic);
holder.right_message = (TextView) convertView.findViewById(R.id.right_message);
holder.left_profilePic = (ImageView) convertView.findViewById(R.id.left_profilePic);
holder.left_message = (TextView) convertView.findViewById(R.id.left_message);
holder.right_time = (TextView) convertView.findViewById(R.id.right_time);
holder.left_time = (TextView) convertView.findViewById(R.id.left_time);
holder.right_image_message = (ImageView) convertView.findViewById(R.id.right_image_message);
holder.left_image_message = (ImageView) convertView.findViewById(R.id.left_image_message);
convertView.setTag(holder);
}
else
holder=(ViewHolder)convertView.getTag();
ChatItemBean bean = (ChatItemBean) chatItemList.get(position);
Log.d("holder", bean.getId() + " | " + GlobalData.myId);
if (bean.getId().equals(GlobalData.myId)) {
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.right_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
//holder.right_image_message.setPadding(0, 0, 0, 20);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
} else {
holder.right_message.setText(bean.getMessage());
holder.right_message.setBackgroundResource(R.drawable.chat_background_right);
}
holder.right_time.setText(bean.getTime());
} else {
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.left_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
holder.left_image_message.setPadding(0, 10, 0, 30);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
} else {
holder.left_message.setText(bean.getMessage());
holder.left_message.setBackgroundResource(R.drawable.chat_background_left);
}
holder.left_time.setText(bean.getTime());
}
return convertView;
}
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.d("getView", "getview called");
ViewHolder holder;
if(convertView==null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.chat_item, null);
holder.right_profilePic = (ImageView) convertView.findViewById(R.id.right_profilePic);
holder.right_message = (TextView) convertView.findViewById(R.id.right_message);
holder.left_profilePic = (ImageView) convertView.findViewById(R.id.left_profilePic);
holder.left_message = (TextView) convertView.findViewById(R.id.left_message);
holder.right_time = (TextView) convertView.findViewById(R.id.right_time);
holder.left_time = (TextView) convertView.findViewById(R.id.left_time);
holder.right_image_message = (ImageView) convertView.findViewById(R.id.right_image_message);
holder.left_image_message = (ImageView) convertView.findViewById(R.id.left_image_message);
convertView.setTag(holder);
}
else
holder=(ViewHolder)convertView.getTag();
ChatItemBean bean = (ChatItemBean) chatItemList.get(position);
Log.d("holder", bean.getId() + " | " + GlobalData.myId);
if (bean.getId().equals(GlobalData.myId)) {
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.right_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
//holder.right_image_message.setPadding(0, 0, 0, 20);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
} else {
holder.right_message.setText(bean.getMessage());
holder.right_message.setBackgroundResource(R.drawable.chat_background_right);
}
holder.right_time.setText(bean.getTime());
} else {
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.left_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
holder.left_image_message.setPadding(0, 10, 0, 30);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
} else {
holder.left_message.setText(bean.getMessage());
holder.left_message.setBackgroundResource(R.drawable.chat_background_left);
}
holder.left_time.setText(bean.getTime());
}
return convertView;
}
Update
Here i tried using two different layouts:
@Override
public View getView(int position, View convertView, ViewGroup parent) {
// TODO Auto-generated method stub
Log.d("getView", "getview called");
ViewHolder holder;
ChatItemBean checkBean = (ChatItemBean) chatItemList.get(position);
if (checkBean.getId().equals(GlobalData.myId)) {
if(convertView==null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.chat_item_right, null);
holder.right_profilePic = (ImageView) convertView.findViewById(R.id.right_profilePic);
holder.right_message = (TextView) convertView.findViewById(R.id.right_message);
holder.right_time = (TextView) convertView.findViewById(R.id.right_time);
holder.right_image_message = (ImageView) convertView.findViewById(R.id.right_image_message);
convertView.setTag(holder);
} else
holder=(ViewHolder)convertView.getTag();
ChatItemBean bean = (ChatItemBean) chatItemList.get(position);
Log.d("holder", bean.getId() + " | " + GlobalData.myId);
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.right_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
//holder.right_image_message.setPadding(0, 0, 0, 20);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.right_image_message);
holder.right_image_message.setBackgroundResource(R.drawable.chat_background_right);
} else {
holder.right_message.setText(bean.getMessage());
holder.right_message.setBackgroundResource(R.drawable.chat_background_right);
}
holder.right_time.setText(bean.getTime());
} else {
if(convertView==null)
{
holder = new ViewHolder();
convertView = inflater.inflate(R.layout.chat_item, null);
holder.left_profilePic = (ImageView) convertView.findViewById(R.id.left_profilePic);
holder.left_message = (TextView) convertView.findViewById(R.id.left_message);
holder.left_time = (TextView) convertView.findViewById(R.id.left_time);
holder.left_image_message = (ImageView) convertView.findViewById(R.id.left_image_message);
convertView.setTag(holder);
}
else
holder=(ViewHolder)convertView.getTag();
ChatItemBean bean = (ChatItemBean) chatItemList.get(position);
Log.d("holder", bean.getId() + " | " + GlobalData.myId);
Picasso.with(context).load(bean.getImage()).resize(130, 130).into(holder.left_profilePic);
if (bean.getType().equals("1")) {
Picasso.with(context).load(init_link + bean.getMessage()).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
holder.left_image_message.setPadding(0, 10, 0, 30);
} else if (bean.getType().equals("2")) {
StringTokenizer tokens = new StringTokenizer(bean.getMessage(), "&");
String first = tokens.nextToken();
String second = tokens.nextToken();
String url = "http://maps.google.com/maps/api/staticmap?center=" +
first + "," + second + "&zoom=15&size=200x200&sensor=false";
Picasso.with(context).load(url).into(holder.left_image_message);
holder.left_image_message.setBackgroundResource(R.drawable.chat_background_left);
} else {
holder.left_message.setText(bean.getMessage());
holder.left_message.setBackgroundResource(R.drawable.chat_background_left);
}
holder.left_time.setText(bean.getTime());
}
return convertView;
}
but my application crashes when i scroll a bit more, like the moment when it tries to mess up, i get the Target must not be null. line 124 loading profile pic using picasso.
12-01 21:14:40.442: E/AndroidRuntime(21764): java.lang.IllegalArgumentException: Target must not be null.
12-01 21:14:40.442: E/AndroidRuntime(21764): at com.squareup.picasso.RequestCreator.into(RequestCreator.java:333)
12-01 21:14:40.442: E/AndroidRuntime(21764): at com.squareup.picasso.RequestCreator.into(RequestCreator.java:319)
12-01 21:14:40.442: E/AndroidRuntime(21764): at com.petcial.petopen.custom.ChatCustomAdapter.getView(ChatCustomAdapter.java:124)