Ok; это решение, которое даст вам идею для дальнейшего развития. Это решит ваши проблемы с датой и даст вам подсказку о том, как решить, как вы отображаете свое время. Этот тип программы требует большой работы, чтобы сделать ее жизнеспособной в качестве приложения. Вам нужно учитывать часовые пояса, где вы храните сообщения и так далее.
Теперь переполнение стека служит не для разработки программ для людей, а для того, чтобы попытаться направить людей в правильном направлении.
Для ответа на ваш вопрос; Я рассказываю об основах, я не даю вам код, готовый к запуску, вам нужно будет выполнить часть работы :)
Это можно решить разными способами, я выбрал следующие:
Использование общих настроек для хранения последней даты и времени. Я подумал о доступе к массивам сообщений чата, но решил, что это может быть проще. Я выбрал общие настройки, чтобы дата последнего сообщения сохранялась при закрытии и повторном открытии приложения. (В конечном итоге сообщения чата необходимо будет сохранить в базе данных [SQLite], чтобы сообщения оставались там, когда приложение закрывается и открывается). Пожалуйста, смотрите мой комментарий в конце.
public class ChatActivity extends ActionBarActivity {
public static final String MyPREF = "MyPrefs" ;
public static final String DATE_KEY = "DateKey" ;
SharedPreferences prefs;
SharedPreferences.Editor editor;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat);
initControls();
pref = getSharedPreferences(MyPREF, MODE_PRIVATE);
// Check that the shared preferences has a value
if(contains(DATE_KEY)){
editor = prefs.edit();
// get the current datetime.
editor.Long(DATE_KEY, date);
editor.commit();
// set the text of the textview android:id="@+id/date"
// with the current formatted date.
}
}
В вашем прослушивателе onclick вы проверяете, что последняя сохраненная дата является сегодняшней датой, если это не так, она преобразуется в сообщение чата, поэтому ее значение можно добавить в массив и отобразить. Вам нужно будет настроить форматирование этих типов сообщений, и вы даже можете добавить уникальный идентификатор для этих сообщений о дате и проверить это или проверить отсутствие идентификатора.. есть много решений.
sendBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
/.../
}
ChatMessage chatMessage = new ChatMessage();
long LastDate = pref.getLong(DATE_KEY, date);
// create an empty chat message with only a date.
// check if the last used date is not today's date.
// if it's not today's date, save it and display it as
// an archived bubble.
if(!LastDate.isToday()){
ChatMessage dateholder = new ChatMessage();
// You'll need to format the date
dateholder.setDate(Formatted LastDate);
// set/change the text of the textview android:id="@+id/date"
// with the current formatted date.
}
// put the current date time into your preferences.
editor = prefs.edit();
editor.putString(DATE_KEY, date);
editor.commit();
/.../
// this is now setting up the new chat message.
chatMessage.setDate(DateFormat.getDateTimeInstance().format(new Date()));
/.../
displayMessage(chatMessage);
}
});
xml Хорошо, теперь вы не хотите, чтобы дата плавала в верхней части экрана, когда есть только одно сообщение. Поэтому сгруппируйте его со списком прокрутки, а затем установите его относительно макета экрана, как это было со списком. Для этого подойдет линейный макет, просто убедитесь, что его ориентация установлена на вертикаль.
Скрепите их вместе.
<LinearLayout
android:layout_above="@+id/messageEdit"
android:layout_below="@+id/meLbl"
android:id="@+id/layout"
.../orentation:vertical ../
<TextView
android:id="@+id/date"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:singleLine="true"
/..//>
<ListView
android:id="@+id/messagesContainer"
.../
...//>
</LinearLayout>
<TextView
android:id="@+id/meLbl"
/.../
/>
<TextView
android:id="@+id/friendLabel"
/.../
/>
Изменить отображение для каждого сообщения. Вам нужно перестать отображать дату и время для каждого сообщения. Если вы хотите показать время для каждого сообщения отдельно и пропустить их в течение той же минуты, как вы упомянули в комментариях, то я дал вам структуру, чтобы разработать, как проверить это и логику программы того, является ли или не отображается.
Вам нужно изменить это в вашем:
public View getView(final int position, View convertView, ViewGroup parent) {
holder.txtMessage.setText(chatMessage.getMessage());
// TODO,
// do a check if(mins are the same don't post
// else post the format without the date)
// holder.txtInfo.setText(chatMessage.getDate());
Не забудьте применить все необходимые импорты.
Я предлагаю, если вы начнете использовать базы данных, вы получите доступ к последней дате оттуда без общих настроек или продолжите использовать общие настройки. Это усложняется, поскольку сохраняется несколько чатов, и в этом случае предпочтительнее использовать базу данных.
person
Community
schedule
22.10.2015