2016-05-10 6 views
0

Meine Android App hat eine einfache Chat-Funktion. Die Chats werden in der integrierten SQLite-Datenbank gespeichert. Ich verwende ein ListView mit einem SimpleCursorAdapter, um die Chats anzuzeigen. Das ist, was ich habe:Wie kann ich einen Android SimpleCursorAdapter ändern, um abhängig von Daten aus der Datenbank ein anderes Layout zu verwenden?

public class Chat extends Fragment { 
    private View rootView; 

    @Override 
    public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState){ 
     rootView = inflater.inflate(R.layout.chat, container, false); 
     return rootView; 
    } 

    @Override 
    public void onViewCreated(View rootView, Bundle savedInstanceState){ 
     super.onViewCreated(rootView, savedInstanceState); 
     displayChats(); 
    } 

    public void displayChats(){ 
     DatabaseHelper databaseHelper = new DatabaseHelper(getActivity()); 
     Cursor chatCursor = databaseHelper.getChatsCursor(); 
     String[] fromColumns = {"messageInfo","messageText"}; 
     int toViews{R.id.message_info, R.id.message_text}; 
     SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.line_of_chat, chatCursor, fromColumns, toViews, 0); 
     ListView listView = (ListView) rootView.findViewById(R.id.chat_text_display); 
     listView.setAdapter(simpleCursorAdapter); 
     databaseHelper.close(); 
    } 
} 

ich ein Chat-Modell habe, die einen boolean hat, mit dem Namen localFlag, als eines seiner Felder. Wenn der Chat vom Gerät gesendet wird, wird localFlag als wahr (oder 1) festgelegt. Wenn der Chat von extern an das Gerät gesendet wird, wird localFlag als false (oder 0) festgelegt.

My SQL-Aufruf:

public static final String GET_ALL_CHATS = "select _id, localFlag, messageText, messageInfo from ChatTable"; 

public Cursor getChatsCursor(){ 
    SQLiteDatabase sqliteDB = this.getReadableDatabase(); 
    return sqliteDB.rawQuery(GET_ALL_CHATS, null); 
} 

Was ich tun möchte, ist, wenn die lokalen Flag gesetzt ist, würde Ich mag dies verwenden:

SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.outgoing_line_of_chat, chatCursor, fromColumns, toViews, 0); 

und wenn die lokalen Flag nicht gesetzt ist würde ich diesen gerne verwenden:

SimpleCursorAdapter simpleCursorAdapter = new SimpleCursorAdapter(getContext(), R.layout.incoming_line_of_chat, chatCursor, fromColumns, toViews, 0); 

Hinweis I R.layout.outgoing_line_of_chat vsverwenden möchte.

Wie kann ich dies erreichen?

+0

in Ihrem ChatSimpleCursorAdapter Konstruktor testen, ob Flag == 1, so dass Sie Ihr Layout an dem Absender gesetzt sonst setzen Ihr Layout zu receiver –

+0

Nicht sicher, wie man das macht. Ich weiß, wie man den Test durchführt, aber was ich nicht weiß ist, wie man 'ChatSimpleCursorAdapter simpleCursorAdapter = new ChatSimpleCursorAdapter (getContext(), R.layout.outgoing_line_of_chat, chatCursor, fromColumns, toViews, 0); 'in meinem erweiterten SimpleCursorAdapter. – Brian

+0

ChatSimpleCursorAdapter Konstruktor immer noch das gleiche löschen Sie einfach die "int-Layout" und den Test, um das Layout auf Ihre super() -Methode, was alles die Parameter Sie super() Methode nicht der ChatSimpleCursorAdapter Konstruktor –

Antwort

0

I this Post gefunden, während auf eine Antwort googeln um. Es passte meine Bedürfnisse und arbeitete gut. Hoffentlich wird dies für jemanden in der Zukunft nützlich sein. Hier ist eine eigene SimpleCursorAdapter Klasse, die ich in Ordnung zu schaffen hatte, es zu benutzen mit meiner Chat.java Klasse:

public class ChatSimpleCursorAdapter extends SimpleCursorAdapter { 
    private Context context; 

    private ChatSimpleCursorAdapter(Context context, int layout, Cursor cursor, String[] from, int[] to, int flags){ 
     this.context = context; 
    } 

    @Override 
    public View getView(int position, View convertView, ViewGroup parent){ 
     if(convertView == null){ 
      LayoutInflater layoutInflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE); 
      switch(getItemViewType(position)){ 
       case 0: 
        convertView = layoutInflater.inflate(R.layout.incoming_line_of_chat, null); 
        break; 
       case 1: 
        convertView = layoutInflater.inflate(R.layout.outgoing_line_of_chat, null); 
        break; 
      } 
     } 

     return super.getView(position, convertView, parent); 
    } 

    @Override 
    public int getItemViewType(int position){ 
     Cursor cursor = getCursor(); 
     cursor.moveToPosition(position); 
     int localFlag = cursor.getInt(1); 
     if(localFlag == 1){ 
      return 1; 
     } 
     return 0; 
    } 

    @Override 
    public int getViewTypeCount(){ 
     return 2; 
    } 
} 
0

Wirklich ich nicht, wenn ich Ihre Frage verstanden habe, aber ich werde versuchen, Ihnen zu helfen.

Sie können dies in der Chat-Klasse:

if (localFlag) { 
    ChatSimpleCursorAdapter simpleCursorAdapter = new ChatSimpleCursorAdapter(getContext(), R.layout.outgoing_line_of_chat, chatCursor, fromColumns, toViews, 0); 
} else { 
    ChatSimpleCursorAdapter simpleCursorAdapter = new ChatSimpleCursorAdapter(getContext(), R.layout.incoming_line_of_chat, chatCursor, fromColumns, toViews, 0); 
} 

Oder dies im Konstruktor von Ihrem ChatSimpleCursorAdapter

if (localFlag) { 
    layout = R.layout.outgoing_line_of_chat; 
} else { 
    layout = R.layout.incoming_line_of_chat; 
} 

super(getContext(), layout, chatCursor, fromColumns, toViews, 0); 
+0

Mit Ihrer ersten Methode bin ich nicht sicher, wie Sie die lokale Flagge erhalten, ohne zuerst den Cursor durchlaufen zu müssen. Bei der zweiten Methode erhalte ich den Fehler, dass 'Call to' super() 'die erste Anweisung im Konstruktor body sein muss. – Brian