【发布时间】:2016-07-19 01:40:34
【问题描述】:
我正在使用自定义阵列适配器来填充我的聊天屏幕。为此,我使用一个条件来查看谁是发件人,并据此分配设计(红色(已接收消息)或蓝色(已发送消息))。
但是,当我第一次发送消息时,它不会检查条件并将默认布局应用于聊天消息。
从那时起,随后,它选择布局的最后一个状态来显示消息,而不检查它是发送消息还是接收消息。(例如,如果我收到一条消息,它将根据条件设置红色,但在那之后,当我发送消息时,它会自动将其分配为红色,而不检查条件(它应该分配为蓝色,因为它是已发送的消息)。
ChatAdapter 的代码如下:
import com.tanishqsharma.unanswered.dbHandler.PrefManager;
import java.util.ArrayList;
/**
* Created by Tanishq on 16-06-2016.
*/
public class ChatAdapter extends ArrayAdapter<MessageObject> {
ArrayList<MessageObject> local_obj;
PrefManager prefManager;
FontGenerator FG;
String sender;
Animation fadein;
Animation fade_out;
String message;
public ChatAdapter(Context context, ArrayList<MessageObject> passed_obj) {
super(context, R.layout.chat_message ,passed_obj);
prefManager = new PrefManager(context);
FG = new FontGenerator(context);
fadein = AnimationUtils.loadAnimation(getContext(), R.anim.fade_in);
fade_out = AnimationUtils.loadAnimation(getContext(), R.anim.fade_out);
this.local_obj = passed_obj;
}
static class ViewHolderChatMessage
{
LinearLayout layoutchat;
LinearLayout mainChatLayout;
TextView message;
TextView datetime;
}
@Override
public View getView(int position, View convertView, ViewGroup parent) {
View view = convertView;
final ViewHolderChatMessage viewHolderChatMessage;
if(view==null)
{
LayoutInflater layoutInflater = LayoutInflater.from(getContext());
view = layoutInflater.inflate(R.layout.chat_message, parent, false);
viewHolderChatMessage = new ViewHolderChatMessage();
viewHolderChatMessage.message = (TextView)view.findViewById(R.id.chatbubble);
viewHolderChatMessage.layoutchat = (LinearLayout)view.findViewById(R.id.layoutchat);
viewHolderChatMessage.mainChatLayout = (LinearLayout)view.findViewById(R.id.mainChatLayout);
viewHolderChatMessage.datetime = (TextView)view.findViewById(R.id.DateTime);
view.setTag(viewHolderChatMessage);
}
else
{
viewHolderChatMessage = (ViewHolderChatMessage) view.getTag();
}
viewHolderChatMessage.mainChatLayout.setGravity(Gravity.BOTTOM);
message = local_obj.get(position).getMessage();
viewHolderChatMessage.message.setText(message);
viewHolderChatMessage.message.setTypeface(FG.getRobotoRegular());
viewHolderChatMessage.datetime.setVisibility(View.GONE);
sender = local_obj.get(position).getSender();
if(sender!=null)
{
if(sender.equals(prefManager.getUserMobile()))
{
viewHolderChatMessage.message.setBackgroundResource(R.drawable.rounded_chat_blue);
viewHolderChatMessage.layoutchat.setGravity(Gravity.END);
viewHolderChatMessage.datetime.setText(local_obj.get(position).getDate());
viewHolderChatMessage.datetime.setGravity(Gravity.END);
}
else
{
viewHolderChatMessage.message.setBackgroundResource(R.drawable.rounded_chat_red);
viewHolderChatMessage.layoutchat.setGravity(Gravity.START);
viewHolderChatMessage.datetime.setText(local_obj.get(position).getDate());
viewHolderChatMessage.datetime.setGravity(Gravity.START);
}
}
viewHolderChatMessage.message.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
viewHolderChatMessage.datetime.setVisibility(View.VISIBLE);
viewHolderChatMessage.datetime.startAnimation(fadein);
viewHolderChatMessage.datetime.postDelayed(new Runnable() {
@Override
public void run() {
viewHolderChatMessage.datetime.setVisibility(View.GONE);
viewHolderChatMessage.datetime.startAnimation(fade_out);
}
}, 3000);
}
});
return view;
}
@Override
public void add(MessageObject object) {
super.add(object);
notifyDataSetChanged();
}
}
例子:
如您所见,第一条消息默认出现在左侧,尽管根据条件,它应该出现在右侧。一直在尝试不同的方法,例如 notifysetdatachanged(),但效果不佳。
我提到的第二个错误,它是根据我猜的最后一个视图发送者将聊天消息添加到适配器。
感谢所有可能的帮助。
【问题讨论】:
标签: android listview arraylist