dimanche 17 mai 2015

Android's simplecursoradapter and multiple row layouts

I've been dabbling with android here and there for the past few months (mostly just tutorials). I've been working on a texting app (for myself) in my free time to learn, and I've succeeded in getting a different layout for each row, but it doesn't work as I'd intended.

Each row is either going to be left or right (left by default), depending on if the number that's in the cursor's position is my phone number or not.

The problem is that my test data looks like this (where the green is my text):

enter image description here

Here's the code for my custom adapter:

public class ConversationMessageListAdapter extends SimpleCursorAdapter {
    private LayoutInflater inflater;
    private String myPhoneNumber;

    public ConversationMessageListAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to, int flags) {
        super(context, layout, cursor, from, to, flags);
        myPhoneNumber = getMyPhoneNumber(context);
        inflater = LayoutInflater.from(context);
    }

    @Override
    public View newView(Context context, Cursor cursor, ViewGroup parent) {
        String number = cursor.getString(2);

        System.out.println("phone#: "+number);
        System.out.println("my#: "+myPhoneNumber);

        if(number.equals(myPhoneNumber)){
            View view = inflater.inflate(R.layout.single_message_layout_right, null);
            return view;
        }

        return super.newView(context, cursor, parent);

    }

    public String getMyPhoneNumber(Context context){
        TelephonyManager tMgr = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE);
        return tMgr.getLine1Number();
    }


}

You can see my attempt at debugging the issue by printing out the values of myPhoneNumber and number. It looks like they aren't always matching up correctly with the rows. It'll show the friend's number on the row where it should be mine, yet if I leave the default layout (keep them all to the left) it shows my number on that same row in the textview. Like:

555-555-FRND
Have you played Dynasty Warriors?
555-555-MINE
Not yet. Maybe soon.

But at that point, what get's printed is:

phone#: 555-555-FRND
my# 555-555-MINE
phone#: 555-555-FRND
my# 555-555-MINE

When it should look like:

phone#: 555-555-FRND
my# 555-555-MINE
phone#: 555-555-MINE
my# 555-555-MINE

I'm at a loss for what's causing this.

If it helps, here's my setViewBinder:

textsDbAdapter.setViewBinder(new ConversationMessageListAdapter.ViewBinder() {
    @TargetApi(Build.VERSION_CODES.LOLLIPOP)
    @Override
    public boolean setViewValue(View view, Cursor cursor, int columnIndex) {

        if(columnIndex == 2){
            String number = cursor.getString(columnIndex);
            String sentBy = getContactName(contentResolver, number);

            if(number.equals(myPhoneNumber)){
                return false;
            }

            TextView sender = (TextView) view;
            sender.setText(sentBy);
            return true;
        }

        //datetime
        if(columnIndex == 5){
            Long messageDatetime = Long.valueOf(cursor.getString(columnIndex));
            String receivedOn;

            if(startOfToday > messageDatetime){
                receivedOn = getDateFromDatetime(messageDatetime);
            } else {
                receivedOn = getTimeFromDatetime(messageDatetime);
            }

            TextView datetime = (TextView) view;
            datetime.setText(receivedOn);
            return true;
        }

        return false;
    }
});

Aucun commentaire:

Enregistrer un commentaire