2016-05-10 4 views
0

У моего приложения Android есть простая функция чата. Чаты хранятся во встроенной базе данных SQLite. Я использую ListView с SimpleCursorAdapter для отображения чатов. Это то, что у меня есть:Как изменить Android SimpleCursorAdapter для использования другого макета в зависимости от данных из базы данных?

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(); 
    } 
} 

У меня есть модель чат, который имеет логическое значение, названный localFlag, как один из его полей. Если чат отправляется с устройства, localFlag устанавливается как истина (или 1), если чат получен от внешнего устройства, localFlag устанавливается как false (или 0).

Мой SQL вызов:

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); 
} 

То, что я хочу сделать, это если локальный флаг установлен, то я хотел бы использовать это:

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

и если локальный флаг не установлен Я хотел бы использовать это:

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

Обратите внимание, что я хочу использовать R.layout.outgoing_line_of_chat против R.layout.incoming_line_of_chat.

Как я могу это сделать?

+0

в вашем ChatSimpleCursorAdapter тест конструктора, если флаг == 1, так что вы установите раскладку отправителю еще установить раскладку to recever –

+0

Не знаете, как это сделать. Я знаю, как выполнить тест, но я не знаю, как использовать 'ChatSimpleCursorAdapter simpleCursorAdapter = новый ChatSimpleCursorAdapter (getContext(), R.layout.outgoing_line_of_chat, chatCursor, fromColumns, toViews, 0); 'в моем расширенном SimpleCursorAdapter. – Brian

+0

Конструктор ChatSimpleCursorAdapter по-прежнему то же самое, просто удалите «макет int» и сделайте тест, чтобы установить макет в свой метод super(), для чего вам нужны все параметры, которые вы супер(), а не конструктор ChatSimpleCursorAdapter –

ответ

0

Я нашел this пост в то время как вокруг прибегая к помощи ответа. Это соответствовало моим потребностям и хорошо работало. Надеюсь, это пригодится кому-то в будущем. Вот пользовательский класс SimpleCursorAdapter, что я должен был создать для того, чтобы использовать его с моим Chat.java класса:

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

Действительно, если я не понял ваш вопрос, но я постараюсь вам помочь.

Вы можете сделать это в классе чата:

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); 
} 

Или это в конструкторе от вашего 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

С помощью вашего первого метода я не уверен, как получить локальный флаг, не пройдя сначала курсором. С помощью второго метода я получаю сообщение об ошибке, что 'Call to 'super()' должен быть первым выражением в body конструктора'. – Brian

 Смежные вопросы

  • Нет связанных вопросов^_^