如何根据来自板载SQLite数据库的数据在ListView中使用不同的布局?

时间:2016-05-11 14:19:35

标签: android listview simplecursoradapter

我的Android应用程序有一个简单的聊天功能。聊天记录存储在板载SQLite数据库中。我正在使用带有SimpleCursorAdapter的ListView来显示聊天。这就是我所拥有的:

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设置为true(或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 vs R.layout.incoming_line_of_chat

我怎样才能完成这项工作?

1 个答案:

答案 0 :(得分:1)

在适配器中使用getItemViewType()getViewTypeCount()通知ListView正在显示不同的行类型,以便它可以提供convertView参数的正确视图到getView()。请参阅this answer以及名为The World of ListView的视频,以获得更全面的解释。

修改

您必须继承SimpleCursorAdapter(尽管您可能希望改为继承CursorAdapter)以覆盖这些方法。

除此之外:您可能需要考虑使用RecyclerView代替ListView。原理是一样的,但使用RecyclerView适配器,您只需要实现getItemViewType()