# MessageList
[中文文档](./usage.md)
MessageList is a message list in chatting interface, use to display all kinds of messages, and it can be fully customize.
If you don't define your style, MessageList will use default style.
## Install
We have support several ways to add dependency. You can choose one of them.
- Gradle:
```groovy
compile 'cn.jiguang.imui:messagelist:0.2.0'
```
- Maven:
```groovy
cn.jiguang.imui
messagelist
0.2.0
pom
```
- JitPack
```groovy
// Add in project's build.gradle
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
// Add in module's build.gradle
dependencies {
compile 'com.github.jpush:imui:0.2.0'
}
```
## Usage
To use MessageList only need three simple steps, or you can check out our [sample project](./../../sample) to
try it yourself.
### 1. Add MessageList in your xml layout:
```xml
```
We have define many kinds of attributes, to support user to adjust their layout, you can see
[attrs.xml](./../src/main/res/values/attrs.xml) in detail, and we support totally customize style either, please look down.
### 2. Construct adapter
Adapter's constructor has three parameters. The first one is `sender id`, the id of sender, the second one is `HoldersConfig object`,
you can use this object to [construct your custom ViewHolder and layout](./customLayoutEn.md), the third one is implement of `ImageLoader`,
use to display user's avatar, if this value is null, will not display avatar.([Click here to know more about ImageLoader](./imageLoadEn.md))
```java
MsgListAdapter adapter = new MsgListAdapter("0", holdersConfig, imageLoader);
messageList.setAdapter(adapter);
```
### 3. Construct model
To be add messages, you need to implement IMessage, IUser interface into your existing model and override it's methods:
```java
public class MyMessage implements IMessage {
private long id;
private String text;
private String timeString;
private MessageType type;
private IUser user;
private String contentFile;
private long duration;
public MyMessage(String text, MessageType type) {
this.text = text;
this.type = type;
this.id = UUID.randomUUID().getLeastSignificantBits();
}
@Override
public String getMsgId() {
return String.valueOf(id);
}
@Override
public IUser getFromUser() {
if (user == null) {
return new DefaultUser("0", "user1", null);
}
return user;
}
public void setUserInfo(IUser user) {
this.user = user;
}
public void setMediaFilePath(String path) {
this.contentFile = path;
}
public void setDuration(long duration) {
this.duration = duration;
}
@Override
public long getDuration() {
return duration;
}
public void setTimeString(String timeString) {
this.timeString = timeString;
}
@Override
public String getTimeString() {
return timeString;
}
@Override
public MessageType getType() {
return type;
}
@Override
public String getText() {
return text;
}
@Override
public String getMediaFilePath() {
return contentFile;
}
}
```
MessageType above is an enum class in IMessage class, you need implement IUser interface, too:
```java
public class DefaultUser implements IUser {
private String id;
private String displayName;
private String avatar;
public DefaultUser(String id, String displayName, String avatar) {
this.id = id;
this.displayName = displayName;
this.avatar = avatar;
}
@Override
public String getId() {
return id;
}
@Override
public String getDisplayName() {
return displayName;
}
@Override
public String getAvatarFilePath() {
return avatar;
}
}
```
That's all! Now you can use your own message model to fill into adapter without type converting of any kind!
## Data management
### Add new messages
To add new message in message list is pretty easy, we support two ways to add new messages:
- Add new message in the bottom of message list: `addToStart(IMESSAGE message, boolean scroll)`
```java
// add a new message in the bottom of message list, the second parameter implys whether to scroll to bottom.
adapter.addToStart(message, true);
```
- Add messages in the top of message list(Usually use this method to load last page of history messages): `addToEnd(List messages)`
```java
// Add messages to the top of message list, messages should be orderd by date.
adapter.addToEnd(messages);
```
- Scroll to load history messages
After adding this listener: `OnLoadMoreListener`,when scroll to top will fire `onLoadMore` event,for example:
```java
mAdapter.setOnLoadMoreListener(new MsgListAdapter.OnLoadMoreListener() {
@Override
public void onLoadMore(int page, int totalCount) {
if (totalCount < mData.size()) {
new Handler().postDelayed(new Runnable() {
@Override
public void run() {
mAdapter.addToEnd(mData);
}
}, 1000);
}
}
});
```
### Delete message
Here are methods to delete message:
- *adapter.deleteById(String id)*: according message id to delete
- *adapter.deleteByIds(String[] ids)*: according message ids' array to delete
- *adapter.delete(IMessage message)*: according message object to delete
- *adapter.delete(List messages)*: according message objects' list to delete
- *adapter.clear()*: delete all messages
### Update message
If message updated, you can invoke these methods to notify adapter to update message:
- *adapter.update(IMessage message)*: message to be updated
- *adapter.update(String oldId, IMessage newMessage)*
## Event handling
- `OnMsgClickListener` fires when click message.
```java
mAdapter.setOnMsgClickListener(new MsgListAdapter.OnMsgClickListener() {
@Override
public void onMessageClick(MyMessage message) {
// do something
}
});
```
- `OnAvatarClickListener` fires when click avatar.
```java
mAdapter.setOnAvatarClickListener(new MsgListAdapter.OnAvatarClickListener() {
@Override
public void onAvatarClick(MyMessage message) {
DefaultUser userInfo = (DefaultUser) message.getUserInfo();
// Do something
}
});
```
- `OnMsgLongClickListener` fires when long click message.
```java
mAdapter.setMsgLongClickListener(new MsgListAdapter.OnMsgLongClickListener() {
@Override
public void onMessageLongClick(MyMessage message) {
// do something
}
});
```
- ‘OnMsgResendListener’ fires when click resend button.
```java
mAdapter.setMsgResendListener(new MsgListAdapter.OnMsgResendListener() {
@Override
public void onMessageResend(MyMessage message) {
// resend message here
}
});
```