我有一个ListView的自定义适配器 getView方法是这样的:
public View getView(int position, View convertView, ViewGroup parent)
{
//final ILSpeechBubble speechBubble;
if(convertView == null)
{
inflater = context.getLayoutInflater();
if(m_msg.get(position).Recieved == 0)
{
convertView = inflater.inflate(R.layout.text_message_sent_row_template, null);
holder = new ViewHolder();
holder.spBubble = (ILSpeechBubble) convertView.findViewById(R.id.iLSpeechBubble1);
holder.imgProfilePic = (ImageView) convertView.findViewById(R.id.imgProfilePic);
holder.imgSend = (ImageView) convertView.findViewById(R.id.imgMessageSent);
holder.imgDeliverd = (ImageView) convertView.findViewById(R.id.imgMessageDeliverd);
holder.pbSending = (ProgressBar) convertView.findViewById(R.id.pbSendingMessage);
holder.spBubble.isChache = false;
holder.Position = position;
convertView.setTag(holder);
m_ViewHolder.add(holder);
}
else
{
convertView = inflater.inflate(R.layout.text_message_recieved_row_template, null);
holder = new ViewHolder();
holder.spBubble = (ILSpeechBubble) convertView.findViewById(R.id.iLSpeechBubble1);
holder.imgProfilePic = (ImageView) convertView.findViewById(R.id.imgProfilePic);
holder.spBubble.isChache = false;
holder.Position = position;
convertView.setTag(holder);
m_ViewHolder.add(holder);
}
}
else
{
holder = (ViewHolder) convertView.getTag();
if(holder.Position == position)
Log.i("View Holder","Position : " + position);
Log.i("View Holder","Position : " + position + " Wrong");
Log.i("View Holder","Position : " + holder.Position + " HolderPos");
//position = holder.Position;
holder = findHolder(position);
if(holder == null)
{
if(m_msg.get(position).Recieved == 0)
{
convertView = inflater.inflate(R.layout.text_message_sent_row_template, null);
holder = new ViewHolder();
holder.spBubble = (ILSpeechBubble) convertView.findViewById(R.id.iLSpeechBubble1);
holder.imgProfilePic = (ImageView) convertView.findViewById(R.id.imgProfilePic);
holder.imgSend = (ImageView) convertView.findViewById(R.id.imgMessageSent);
holder.imgDeliverd = (ImageView) convertView.findViewById(R.id.imgMessageDeliverd);
holder.pbSending = (ProgressBar) convertView.findViewById(R.id.pbSendingMessage);
holder.spBubble.isChache = false;
holder.Position = position;
convertView.setTag(holder);
m_ViewHolder.add(holder);
}
else
{
convertView = inflater.inflate(R.layout.text_message_recieved_row_template, null);
holder = new ViewHolder();
holder.spBubble = (ILSpeechBubble) convertView.findViewById(R.id.iLSpeechBubble1);
holder.imgProfilePic = (ImageView) convertView.findViewById(R.id.imgProfilePic);
holder.spBubble.isChache = false;
holder.Position = position;
convertView.setTag(holder);
m_ViewHolder.add(holder);
}
}
Log.i("View Holder","Position After Find : " + position + " Wrong");
Log.i("View Holder","Position After Find : " + holder.Position + " HolderPos");
holder.spBubble.isChache = true;
//return v;
}
if(m_msg.get(position).Recieved == 0)
{
holder.spBubble.setBubbleDirectionLeft(false);
//speechBubble.setBubbleDirectionLeft(false);
holder.spBubble.setTextAlign(Align.RIGHT);
if (m_msg.get(position).Deliverd == 1)
{
holder.imgDeliverd.setVisibility(View.VISIBLE);
holder.imgDeliverd.setImageResource(R.drawable.message_deliverd);
holder.imgSend.setVisibility(View.GONE);
holder.pbSending.setVisibility(View.GONE);
}
else if (m_msg.get(position).Sent == 1)
{
holder.imgDeliverd.setVisibility(View.GONE);
holder.imgSend.setVisibility(View.VISIBLE);
holder.imgSend.setImageResource(R.drawable.message_sent);
holder.pbSending.setVisibility(View.GONE);
}
}
else
{
holder.spBubble.setBubbleDirectionLeft(true);
holder.spBubble.setTextAlign(Align.RIGHT);
}
CContacts_Info contact = cl_ContactInfo.GetContact(m_ContactILId);
holder.spBubble.setMessageBody(m_msg.get(position).MessageBody);
if(m_msg.get(position).MessageType.equals(AttachType.Emoji.name()))
holder.spBubble.setEmojiList(m_EmojiList);
else if(m_msg.get(position).MessageType.equals(AttachType.Picture.name()))
{
holder.spBubble.setImageSize(128, 128);
holder.spBubble.setImageReadyState(m_msgList.get(position).isImageReady);
if(m_msgList.get(position).isImageReady)
holder.spBubble.setPictureMessageThumbPic(m_msgList.get(position).ThumbPic);
}
holder.spBubble.setVisibility(View.VISIBLE);
holder.spBubble.setTextColor(Color.WHITE);
holder.spBubble.setFontSize(m_Default_FontSize);
holder.spBubble.setMessageId(m_msg.get(position)._id);
if (m_msg.get(position)._id == iMessageId)
{
if (m_msg.get(position).iProgressValue == 100)
m_Downloading = false;
else
m_msg.get(position).iProgressValue += 10;
holder.spBubble.SetProgress(m_msg.get(position).iProgressValue);
}
else
holder.spBubble.SetProgress(100);
//ImageView imgProfilePic = (ImageView) convertView.findViewById(R.id.imgProfilePic);
//holder.imgProfilePic.setPadding(0, holder.spBubble.getHeight(), 0, 0);
if(contact.ProfilePic != null)
{
Bitmap bitmap = BitmapFactory.decodeByteArray(contact.ProfilePic, 0,
contact.ProfilePic.length,m_BitmapOPT);
holder.imgProfilePic.setImageBitmap(bitmap);
}
else
{
holder.imgProfilePic.setImageResource(R.drawable.profile_pic);
}
if (m_isStop)
{
holder.spBubble.setVoiceMessage_Play(false);
holder.spBubble.invalidate();
m_isStop = false;
}
if (m_Playing)
UpdateTimer(holder.spBubble);
// UpdateTimer(holder.spBubble);
holder.spBubble.setOnClickListener(new OnClickListener()
{
@Override
public void onClick(View v)
{
String messageType = m_msg.get(holder.Position).MessageType;
if (messageType.equals(AttachType.VoiceMessage.name()))
{
if (m_Playing)
{
stopPlaying();
holder.spBubble.setVoiceMessage_Play(false);
holder.spBubble.invalidate();
}
else
{
String source = holder.spBubble.getAttachSource();
// Toast.makeText(Message_Activity.this, source,
// 1000).show();
startPlaying(source);
ShowNotify(R.string.VoiceMessage_Play_Title);
update_Timer.run();
}
}
else if (messageType.equals(AttachType.Audio.name()))
{
if (holder.spBubble.getProgress() < 100)
return;
String source = holder.spBubble.getAttachSource();
Intent intent = new Intent();
intent.setAction(android.content.Intent.ACTION_VIEW);
File file = new File(source);
intent.setDataAndType(Uri.fromFile(file), "audio/*");
startActivity(intent);
}
else if (messageType.equals(AttachType.Video.name()))
{
if (holder.spBubble.getProgress() < 100)
return;
String source = holder.spBubble.getAttachSource();
Intent intent = new Intent(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse(source), "video/*");
startActivity(intent);
}
else if (messageType.equals(AttachType.Picture.name()))
{
String source = holder.spBubble.getAttachSource();
Intent intent = new Intent();
intent.setAction(Intent.ACTION_VIEW);
intent.setDataAndType(Uri.parse("file:///" + source), "image/*");
startActivity(intent);
}
}
});
holder.spBubble.setOnLongClickListener(new OnLongClickListener()
{
@Override
public boolean onLongClick(View v)
{
List<Action_Type> actionList = CreatePopUpMenuList_Message(m_msg.get(holder.Position)._id);
ListView lstPopUpAction = (ListView) m_PopUpDialog.findViewById(R.id.listView1);
lstPopUpAction.setAdapter(new Show_Action_Adapter(Message_Activity.this,
actionList));
m_PopUpDialog.show();
return true;
}
});
holder.spBubble.invalidate();
//convertView.setTag(holder);
return convertView;
}
但滚动后在listView中显示的项目是错误的,有时会重复项目,有时会显示错误的顺序以显示列表项目 我将if / else之后的item值设置为查看,但问题没有解决! 如果我再次创建视图而不是用于缓存convertView(意味着:
if(convertView == null
该项目正确显示,但如果滚动到应用程序崩溃,以获得太多内存 我完全糊涂了,不知道怎么解决它。
答案 0 :(得分:0)
尝试在getView中实例化你的holder类(我看不到你在哪里实例化它)
@Override
public View getView(int position, View convertView, ViewGroup parent) {
ViewHolder holder;
然后确保您的ViewHolder类是静态的,并检查您的getCount()方法以返回正确的列表大小。