I'm having trouble filling data from my SQLite Database into a list in a detail view. Since I am new to Android development, I searched Google for tutorials and stuff but could not apply anything to my problem.
The app is supposed to simulate the Message app of a car entertainment system.
Here's my code:
ChatListActivity:
package com.example.jt.cesd;
import android.app.Activity;
import android.content.Intent;
import android.os.Bundle;
import android.util.Log;
import android.view.MenuItem;
import android.view.View;
import android.widget.EditText;
import android.widget.ListView;
import java.util.ArrayList;
import java.util.List;
public class ChatListActivity extends Activity
implements ChatListFragment.Callbacks {
private boolean mTwoPane;
public static final String LOG_TAG = ChatListActivity.class.getSimpleName();
List messageList = new ArrayList<Message>();
private MessageDataSource dataSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_list);
if (findViewById(R.id.chat_detail_container) != null) {
mTwoPane = true;
((ChatListFragment) getFragmentManager()
.findFragmentById(R.id.chat_list))
.setActivateOnItemClick(true);
Bundle arguments = new Bundle();
arguments.putString(ChatDetailFragment.ARG_ITEM_ID, "Hallo");
ChatDetailFragment fragment = new ChatDetailFragment();
fragment.setArguments(arguments);
getFragmentManager().beginTransaction().replace(R.id.chat_detail_container, fragment).commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
return true;
}
return super.onOptionsItemSelected(item);
}
@Override
public void onItemSelected(String id) {
if (mTwoPane) {
Bundle arguments = new Bundle();
arguments.putString(ChatDetailFragment.ARG_ITEM_ID, id);
} else {
Intent detailIntent = new Intent(this, ChatDetailActivity.class);
detailIntent.putExtra(ChatDetailFragment.ARG_ITEM_ID, id);
startActivity(detailIntent);
}
}
public void sendMessage(View view) {
EditText messageEditText = (EditText) findViewById(R.id.messageEditText);
String messageContent = messageEditText.getText().toString();
if (!messageContent.isEmpty()) {
dataSource = new MessageDataSource(this);
dataSource.open();
dataSource.createMessage(messageContent, "Jan Theiss", 1L, dataSource.currentTime());
((ChatListFragment) getFragmentManager() //
.findFragmentById(R.id.chat_list)).updateChatList();
Log.d(LOG_TAG, "chatList was updated." + messageContent + ".");
dataSource.close();
messageEditText.setText("");
} else {
Log.d(LOG_TAG, "Textfeld war leer. Keine Nachricht versendet.");
}
}
public void createMessageListView(){
ListView messageListView = (ListView) findViewById(R.id.messagesListView);
dataSource = new MessageDataSource(this);
dataSource.open();
messageList = dataSource.getChat("Jan Theiss");
dataSource.close();
messageListView.setAdapter(new MessageListAdapter(this, messageList));
}
}
ChatListFragment:
package com.example.jt.cesd;
import android.app.Activity;
import android.app.ListFragment;
import android.os.Bundle;
import android.view.View;
import android.widget.ListView;
import com.example.jt.cesd.dummy.DummyContent;
import java.util.List;
public class ChatListFragment extends ListFragment {
private static final String STATE_ACTIVATED_POSITION = "activated_position";
public List<ChatListItem> messageListItemList;
private MessageDataSource dataSource;
public ChatListAdapter chatListAdapter;
//ListView messageListView = (ListView) getActivity().findViewById(R.id.messagesListView);
private Callbacks mCallbacks = sDummyCallbacks;
private int mActivatedPosition = ListView.INVALID_POSITION;
public interface Callbacks {
public void onItemSelected(String id);
}
private static Callbacks sDummyCallbacks = new Callbacks() {
@Override
public void onItemSelected(String id) {
}
};
public ChatListFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
dataSource = new MessageDataSource(getActivity());
dataSource.open();
messageListItemList = dataSource.getAllChatPartners();
dataSource.close();
chatListAdapter = new ChatListAdapter(getActivity(), messageListItemList);
setListAdapter(chatListAdapter);
}
@Override
public void onViewCreated(View view, Bundle savedInstanceState) {
super.onViewCreated(view, savedInstanceState);
if (savedInstanceState != null
&& savedInstanceState.containsKey(STATE_ACTIVATED_POSITION)) {
setActivatedPosition(savedInstanceState.getInt(STATE_ACTIVATED_POSITION));
}
}
@Override
public void onAttach(Activity activity) {
super.onAttach(activity);
if (!(activity instanceof Callbacks)) {
throw new IllegalStateException("Activity must implement fragment's callbacks.");
}
mCallbacks = (Callbacks) activity;
}
@Override
public void onDetach() {
super.onDetach();
mCallbacks = sDummyCallbacks;
}
@Override
public void onListItemClick(ListView listView, View view, int position, long id) {
super.onListItemClick(listView, view, position, id);
mCallbacks.onItemSelected(DummyContent.ITEMS.get(position).id);
}
@Override
public void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
if (mActivatedPosition != ListView.INVALID_POSITION) {
outState.putInt(STATE_ACTIVATED_POSITION, mActivatedPosition);
}
}
public void setActivateOnItemClick(boolean activateOnItemClick) {
getListView().setChoiceMode(activateOnItemClick
? ListView.CHOICE_MODE_SINGLE
: ListView.CHOICE_MODE_NONE);
}
private void setActivatedPosition(int position) {
if (position == ListView.INVALID_POSITION) {
getListView().setItemChecked(mActivatedPosition, false);
} else {
getListView().setItemChecked(position, true);
}
mActivatedPosition = position;
}
public void updateChatList() {
dataSource = new MessageDataSource(getActivity());
dataSource.open();
messageListItemList = dataSource.getAllChatPartners();
dataSource.close();
chatListAdapter = new ChatListAdapter(getActivity(), messageListItemList);
setListAdapter(chatListAdapter);
}
}
ChatDetailActivity:
public class ChatDetailActivity extends Activity {
MessageDataSource dataSource;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_chat_detail);
getActionBar().setDisplayHomeAsUpEnabled(true);
if (savedInstanceState == null) {
arguments.putString(ChatDetailFragment.ARG_ITEM_ID,
getIntent().getStringExtra(ChatDetailFragment.ARG_ITEM_ID));
ChatDetailFragment fragment = new ChatDetailFragment();
fragment.setArguments(arguments);*/
getFragmentManager().beginTransaction().add(R.id.chat_detail_container, new MessageFragment())
.commit();
}
}
@Override
public boolean onOptionsItemSelected(MenuItem item) {
int id = item.getItemId();
if (id == android.R.id.home) {
navigateUpTo(new Intent(this, ChatListActivity.class));
return true;
}
return super.onOptionsItemSelected(item);
}
}
ChatDetailFragment:
package com.example.jt.cesd;
import android.app.Fragment;
import android.os.Bundle;
import android.util.Log;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ListView;
import java.util.List;
public class ChatDetailFragment extends Fragment {
public static final String ARG_ITEM_ID = "item_id";
private List<MessageListItem> messagesList;
private ListView messagesListView;
public ChatDetailFragment() {
}
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
if (getArguments().containsKey(ARG_ITEM_ID)) {
MessageDataSource dataSource = new MessageDataSource(getActivity());
messagesList = dataSource.getChat("Günther Battenberg");
}
}
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View rootView = inflater.inflate(R.layout.fragment_chat_detail, container, false);
messagesListView = ((ListView) rootView.findViewById(R.id.messagesListView));
messagesListView.setAdapter(new MessageListAdapter(getActivity(), messagesList));
return rootView;
}
}
MessageDataSource:
package com.example.jt.cesd;
import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.util.Log;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.List;
public class MessageDataSource {
private static final String LOG_TAG = MessageDataSource.class.getSimpleName();
private SQLiteDatabase database;
private MessageDbHelper dbHelper;
private String[] columns = {
MessageDbHelper.COLUMN_ID,
MessageDbHelper.COLUMN_MESSAGECONTENT,
MessageDbHelper.COLUMN_CHATPARTNER,
MessageDbHelper.COLUMN_SENTORRECEIVED,
MessageDbHelper.COLUMN_DATETIME
};
public MessageDataSource(Context context) {
Log.d(LOG_TAG, "Unsere DataSource erzeugt jetzt den DB-Helper");
Log.d(LOG_TAG, context.toString());
dbHelper = new MessageDbHelper(context);
}
public void open() {
Log.d(LOG_TAG, "Eine Referenz auf die DB wird jetzt angefragt.");
database = dbHelper.getWritableDatabase();
Log.d(LOG_TAG, "Datenbankreferenz erhalten. Pfad zu DB: " + database.getPath());
}
public void close() {
dbHelper.close();
Log.d(LOG_TAG, "DB mit Hilfe des DbHelpers geschlossen");
}
public Message createMessage(String messageContent, String chatPartner, long sentOrReceived, long dateTime){
ContentValues values = new ContentValues();
values.put(MessageDbHelper.COLUMN_MESSAGECONTENT, messageContent);
values.put(MessageDbHelper.COLUMN_CHATPARTNER, chatPartner);
values.put(MessageDbHelper.COLUMN_SENTORRECEIVED, sentOrReceived);
values.put(MessageDbHelper.COLUMN_DATETIME, dateTime);
long insertId = database.insert(MessageDbHelper.TABLE_MESSAGE_LIST, null, values);
Cursor cursor = database.query(MessageDbHelper.TABLE_MESSAGE_LIST, columns, MessageDbHelper.COLUMN_ID + "=" + insertId, null, null, null, null);
cursor.moveToFirst();
Message message = cursorToMessage(cursor);
cursor.close();
Log.d(LOG_TAG, "Neue Nachricht wurde eingetragen: " + messageContent);
return message;
}
private Message cursorToMessage(Cursor cursor){
int idIndex = cursor.getColumnIndex(MessageDbHelper.COLUMN_ID);
int idMessageContent = cursor.getColumnIndex(MessageDbHelper.COLUMN_MESSAGECONTENT);
int idChatPartner = cursor.getColumnIndex(MessageDbHelper.COLUMN_CHATPARTNER);
int idSentOrReceived = cursor.getColumnIndex(MessageDbHelper.COLUMN_SENTORRECEIVED);
int idDateTime = cursor.getColumnIndex(MessageDbHelper.COLUMN_DATETIME);
String messageContent = cursor.getString(idMessageContent);
String chatPartner = cursor.getString(idChatPartner);
int sentOrReceived = cursor.getInt(idSentOrReceived);
long dateTime = cursor.getInt(idDateTime);
long id = cursor.getLong(idIndex);
Message message = new Message(messageContent, chatPartner, sentOrReceived, dateTime, id);
return message;
}
private MessageListItem cursorToMessageListItem(Cursor cursor){
int idIndex = cursor.getColumnIndex(MessageDbHelper.COLUMN_ID);
int idMessageContent = cursor.getColumnIndex(MessageDbHelper.COLUMN_MESSAGECONTENT);
int idChatPartner = cursor.getColumnIndex(MessageDbHelper.COLUMN_CHATPARTNER);
int idSentOrReceived = cursor.getColumnIndex(MessageDbHelper.COLUMN_SENTORRECEIVED);
int idDateTime = cursor.getColumnIndex(MessageDbHelper.COLUMN_DATETIME);
String messageContent = cursor.getString(idMessageContent);
String chatPartner = cursor.getString(idChatPartner);
int sentOrReceived = cursor.getInt(idSentOrReceived);
long dateTime = cursor.getInt(idDateTime);
long id = cursor.getLong(idIndex);
MessageListItem messageListItem = new MessageListItem(messageContent, chatPartner, dateTime, id, sentOrReceived);
return messageListItem;
}
public List<Message> getAllMessages() {
List<Message> messageList = new ArrayList<>();
Cursor cursor = database.query(MessageDbHelper.TABLE_MESSAGE_LIST, columns, null, null, null, null, null);
cursor.moveToFirst();
Message message;
while (!cursor.isAfterLast()) {
message = cursorToMessage(cursor);
messageList.add(message);
Log.d(LOG_TAG, "ID: " + message.getId() + ", Inhalt: " + message.toString());
cursor.moveToNext();
}
cursor.close();
return messageList;
}
public List<ChatListItem> getAllChatPartners() {
List<ChatListItem> chatPartnerList = new ArrayList<>();
List<String> testList = new ArrayList<>();
Cursor cursor = database.query(MessageDbHelper.TABLE_MESSAGE_LIST, columns, null, null, null, null, MessageDbHelper.COLUMN_DATETIME + " DESC");
cursor.moveToFirst();
Message currentMessage;
while (!cursor.isAfterLast()) {
currentMessage = cursorToMessage(cursor);
if(!testList.contains(currentMessage.getChatPartner())) {
chatPartnerList.add(new ChatListItem(currentMessage.getChatPartner()));
testList.add(currentMessage.getChatPartner());
}
Log.d(LOG_TAG, "Bereits in Liste vorhanden: " + currentMessage.getChatPartner() + " " + String.valueOf(chatPartnerList.contains(currentMessage.getChatPartner())));
cursor.moveToNext();
}
cursor.close();
return chatPartnerList;
}
public List<MessageListItem> getChat(String chatPartner){
List<MessageListItem> messageList = new ArrayList<>();
Cursor cursor = database.query(MessageDbHelper.TABLE_MESSAGE_LIST, columns, MessageDbHelper.COLUMN_CHATPARTNER + "='" + chatPartner + "'", null, null, null, MessageDbHelper.COLUMN_DATETIME + " ASC");
cursor.moveToFirst();
MessageListItem currentMessageListItem;
while (!cursor.isAfterLast()) {
currentMessageListItem = cursorToMessageListItem(cursor);
messageList.add(currentMessageListItem);
}
return messageList;
}
public long currentTime() {
long currentTime;
Calendar rightNow = Calendar.getInstance();
currentTime = rightNow.get(Calendar.SECOND)
+ 100L * rightNow.get(Calendar.MINUTE)
+ 10000L * rightNow.get(Calendar.HOUR_OF_DAY)
+ 1000000L * rightNow.get(Calendar.DAY_OF_MONTH)
+ 100000000L * (rightNow.get(Calendar.MONTH) + 1 )
+ 10000000000L * (rightNow.get(Calendar.YEAR) - 2000);
Log.d(LOG_TAG, "Current time was requested: " + String.valueOf(currentTime) + " " + rightNow.get(Calendar.MONTH));
return currentTime;
}
public void resetDb() {
// Delete Content of Table:
String SQL_DELETE = "DELETE FROM " + MessageDbHelper.TABLE_MESSAGE_LIST;
database.execSQL(SQL_DELETE);
// Recreate Content:
List<Message> messageList = new ArrayList<>();
int i = 0;
messageList.add(new Message("Sag nicht, dass ich eine falsche Adresse habe.", "Günther Battenberg", 1, 150828143322L, 100));
messageList.add(new Message("Welche hast du denn?", "Günther Battenberg", 0, 150828143338L, 100));
messageList.add(new Message("Franktfurter Straße 128", "Günther Battenberg", 1, 150828143430L, 100));
messageList.add(new Message("Da hab ich bis vor 2 Jahren gewohnt. Die neue Adresse ist Eulenkopfstraße 11.", "Günther Battenberg", 0, 150828143448L, 100));
messageList.add(new Message("Bin unterwegs.", "Günther Battenberg", 1, 150828143504L, 100));
messageList.add(new Message("Wir haben die zwei-Finger-Gesten heute fertig geschrieben, sie funktionieren einwandfrei.", "Lukas Schneebli", 1, 150828143504L, 100));
messageList.add(new Message("Bin unterwegs.", "Lukas Schneebli", 0, currentTime(), 100));
for(i = 0; i < messageList.size(); i++) {
createMessage(messageList.get(i).getMessageContent(), messageList.get(i).getChatPartner(), messageList.get(i).getSentOrReceived(), messageList.get(i).getDate());
Log.d(LOG_TAG, "Hinzugefügt: " + messageList.get(i).toString());
}
}
}
MessageListAdapter:
package com.example.jt.cesd;
import android.app.Activity;
import android.content.Context;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.ArrayAdapter;
import android.widget.TextView;
import java.util.List;
public class MessageListAdapter extends ArrayAdapter{
private Context context;
private boolean useList = true;
public MessageListAdapter(Context context, List items) {
super(context, android.R.layout.simple_list_item_1, items);
this.context = context;
}
private class ViewHolder{
TextView messageContent;
}
public View getView(int position, View convertView, ViewGroup parent){
ViewHolder holder = null;
MessageListItem item = (MessageListItem) getItem(position);
View viewToUse = null;
LayoutInflater mInflater = (LayoutInflater) context.getSystemService(Activity.LAYOUT_INFLATER_SERVICE);
if(convertView == null) {
if(useList){
viewToUse = mInflater.inflate(R.layout.message_sent_list_item, null);
} else {
viewToUse = mInflater.inflate(R.layout.message_grid_item, null);
}
holder = new ViewHolder();
holder.messageContent = (TextView) viewToUse.findViewById(R.id.messageSentTextView);
viewToUse.setTag(holder);
} else {
viewToUse = convertView;
holder = (ViewHolder) viewToUse.getTag();
}
holder.messageContent.setText(item.getMessageContent());
return viewToUse;
}
}
MessageListItem:
package com.example.jt.cesd;
public class MessageListItem {
private String messageContent;
private String chatPartner;
private long dateTime;
private long messageId;
private long sentOrReceived;
public MessageListItem(String messageContent, String chatPartner, long dateTime, long messageId, long sentOrReceived) {
this.messageContent = messageContent;
this.chatPartner = chatPartner;
this.dateTime = dateTime;
this.messageId = messageId;
this.sentOrReceived = sentOrReceived;
}
public String getMessageContent() {
return messageContent;
}
public String getChatPartner() {
return chatPartner;
}
public long getDateTime() {
return dateTime;
}
public long getMessageId() {
return messageId;
}
public long getSentOrReceived() {
return sentOrReceived;
}
}
message_sent_list_item:
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://ift.tt/nIICcg"
android:layout_width="match_parent" android:layout_height="match_parent"
android:gravity="right">
<TextView
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/exampleText"
android:id="@+id/messageSentTextView"
android:layout_gravity="top|left"
android:background="@drawable/message_sent"
android:layout_margin="10dp"
android:textSize="30sp"
android:elegantTextHeight="true"
android:textAppearance="?android:attr/textAppearanceLarge"
android:padding="10dp"
android:gravity="top|right" />
</LinearLayout>
I hope it is not too much code but I wanted to post everything that could potentially be relevant to understand what I'm trying to do.
Thank you so much for your support!
Aucun commentaire:
Enregistrer un commentaire