lundi 7 septembre 2015

Android Studio: ListView in Detail Flow Fragment

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