Commit 656dbb91 authored by Grigory Fedorov's avatar Grigory Fedorov

ChatMessageAdapter: refactored and performance should be improved

(Item view is not created every time).
parent 31bce8cd
...@@ -70,8 +70,7 @@ public class ChatViewerFragment extends Fragment { ...@@ -70,8 +70,7 @@ public class ChatViewerFragment extends Fragment {
View view = inflater.inflate(R.layout.chat_viewer_item, container, false); View view = inflater.inflate(R.layout.chat_viewer_item, container, false);
chatMessageAdapter = new ChatMessageAdapter(getActivity()); chatMessageAdapter = new ChatMessageAdapter(getActivity(), account, user);
chatMessageAdapter.setChat(account, user);
listView = (ListView) view.findViewById(android.R.id.list); listView = (ListView) view.findViewById(android.R.id.list);
listView.setAdapter(chatMessageAdapter); listView.setAdapter(chatMessageAdapter);
...@@ -133,8 +132,6 @@ public class ChatViewerFragment extends Fragment { ...@@ -133,8 +132,6 @@ public class ChatViewerFragment extends Fragment {
public void afterTextChanged(Editable text) { public void afterTextChanged(Editable text) {
if (skipOnTextChanges) if (skipOnTextChanges)
return; return;
String account = chatMessageAdapter.getAccount();
String user = chatMessageAdapter.getUser();
ChatStateManager.getInstance().onComposing(account, user, text); ChatStateManager.getInstance().onComposing(account, user, text);
} }
......
...@@ -55,9 +55,12 @@ import java.util.List; ...@@ -55,9 +55,12 @@ import java.util.List;
*/ */
public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter { public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter {
private static final int TYPE_MESSAGE = 0; private static final int VIEW_TYPE_COUNT = 4;
private static final int TYPE_HINT = 1;
private static final int TYPE_EMPTY = 2; private static final int VIEW_TYPE_EMPTY = 0;
private static final int VIEW_TYPE_HINT = 1;
private static final int VIEW_TYPE_INCOMING_MESSAGE = 2;
private static final int VIEW_TYPE_OUTGOING_MESSAGE = 3;
private final Activity activity; private final Activity activity;
private String account; private String account;
...@@ -80,11 +83,12 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -80,11 +83,12 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
*/ */
private String hint; private String hint;
public ChatMessageAdapter(Activity activity) { public ChatMessageAdapter(Activity activity, String account, String user) {
this.activity = activity; this.activity = activity;
messages = Collections.emptyList(); messages = Collections.emptyList();
account = null; this.account = account;
user = null; this.user = user;
isMUC = MUCManager.getInstance().hasRoom(account, user);
hint = null; hint = null;
appearanceStyle = SettingsManager.chatsAppearanceStyle(); appearanceStyle = SettingsManager.chatsAppearanceStyle();
ChatsDivide chatsDivide = SettingsManager.chatsDivide(); ChatsDivide chatsDivide = SettingsManager.chatsDivide();
...@@ -117,29 +121,24 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -117,29 +121,24 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
@Override @Override
public int getViewTypeCount() { public int getViewTypeCount() {
return 3; return VIEW_TYPE_COUNT;
} }
@Override @Override
public int getItemViewType(int position) { public int getItemViewType(int position) {
if (position < messages.size()) { if (position >= messages.size()) {
return TYPE_MESSAGE; return hint == null ? VIEW_TYPE_EMPTY : VIEW_TYPE_HINT;
} else {
return hint == null ? TYPE_EMPTY : TYPE_HINT;
} }
}
private void append(SpannableStringBuilder builder, CharSequence text, CharacterStyle span) { final boolean incoming = ((MessageItem) getItem(position)).isIncoming();
int start = builder.length(); return incoming ? VIEW_TYPE_INCOMING_MESSAGE : VIEW_TYPE_OUTGOING_MESSAGE;
builder.append(text);
builder.setSpan(span, start, start + text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
} }
@Override @Override
public View getView(int position, View convertView, ViewGroup parent) { public View getView(int position, View convertView, ViewGroup parent) {
final int type = getItemViewType(position); final int type = getItemViewType(position);
if (type == TYPE_EMPTY) { if (type == VIEW_TYPE_EMPTY) {
if (convertView == null) { if (convertView == null) {
return activity.getLayoutInflater().inflate(R.layout.chat_viewer_empty, parent, false); return activity.getLayoutInflater().inflate(R.layout.chat_viewer_empty, parent, false);
} else { } else {
...@@ -147,7 +146,7 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -147,7 +146,7 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
} }
} }
if (type == TYPE_HINT) { if (type == VIEW_TYPE_HINT) {
View view = convertView; View view = convertView;
if (convertView == null) { if (convertView == null) {
view = activity.getLayoutInflater().inflate(R.layout.chat_viewer_info, parent, false); view = activity.getLayoutInflater().inflate(R.layout.chat_viewer_info, parent, false);
...@@ -159,8 +158,20 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -159,8 +158,20 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
return view; return view;
} }
if (type != TYPE_MESSAGE) { View view = convertView;
throw new IllegalStateException();
if (convertView == null) {
final int layoutId;
if (type == VIEW_TYPE_INCOMING_MESSAGE) {
layoutId = R.layout.chat_viewer_incoming_message;
} else if (type == VIEW_TYPE_OUTGOING_MESSAGE) {
layoutId = R.layout.chat_viewer_outgoing_message;
} else {
throw new IllegalStateException();
}
view = activity.getLayoutInflater().inflate(layoutId, parent, false);
} }
final MessageItem messageItem = (MessageItem) getItem(position); final MessageItem messageItem = (MessageItem) getItem(position);
...@@ -168,14 +179,6 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -168,14 +179,6 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
final String resource = messageItem.getResource(); final String resource = messageItem.getResource();
final int layoutId;
if (incoming) {
layoutId = R.layout.chat_viewer_message;
} else {
layoutId = R.layout.chat_viewer_message_own;
}
View view = activity.getLayoutInflater().inflate(layoutId, parent, false);
TextView textView = (TextView) view.findViewById(R.id.text); TextView textView = (TextView) view.findViewById(R.id.text);
textView.setTextAppearance(activity, appearanceStyle); textView.setTextAppearance(activity, appearanceStyle);
...@@ -254,6 +257,12 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -254,6 +257,12 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
return view; return view;
} }
private void append(SpannableStringBuilder builder, CharSequence text, CharacterStyle span) {
int start = builder.length();
builder.append(text);
builder.setSpan(span, start, start + text.length(), Spannable.SPAN_EXCLUSIVE_EXCLUSIVE);
}
private void setUpAvatar(MessageItem messageItem, View view) { private void setUpAvatar(MessageItem messageItem, View view) {
ImageView avatarView = (ImageView) view.findViewById(R.id.avatar); ImageView avatarView = (ImageView) view.findViewById(R.id.avatar);
...@@ -281,27 +290,6 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -281,27 +290,6 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
} }
} }
public String getAccount() {
return account;
}
public String getUser() {
return user;
}
/**
* Changes managed chat.
*
* @param account
* @param user
*/
public void setChat(String account, String user) {
this.account = account;
this.user = user;
this.isMUC = MUCManager.getInstance().hasRoom(account, user);
onChange();
}
@Override @Override
public void onChange() { public void onChange() {
messages = new ArrayList<>(MessageManager.getInstance().getMessages(account, user)); messages = new ArrayList<>(MessageManager.getInstance().getMessages(account, user));
...@@ -331,18 +319,4 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter ...@@ -331,18 +319,4 @@ public class ChatMessageAdapter extends BaseAdapter implements UpdatableAdapter
} }
return null; return null;
} }
/**
* Contact information has been changed. Renews hint and updates data if
* necessary.
*/
public void updateInfo() {
String info = getHint();
if (this.hint.equals(info) || (this.hint != null && this.hint.equals(info))) {
return;
}
this.hint = info;
notifyDataSetChanged();
}
} }
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment